首页 文章

正则表达式,用于查找包含在两个字符之间的字符串,同时排除分隔符

提问于
浏览
221

我需要从字符串中提取一组包含在两个分隔符之间的字符,而不返回分隔符本身 .

一个简单的例子应该是有用的:

Target :提取方括号之间的子字符串,而不返回括号本身 .

Base stringThis is a test string [more or less]

如果我使用以下reg . 恩 .

\[.*?\]

比赛是 [more or less] . 我只需要 more or less (没有括号) .

有可能吗?

10 回答

  • 38

    轻松完成:

    (?<=\[)(.*?)(?=\])
    

    从技术上讲,这是使用前瞻和外观 . 见Lookahead and Lookbehind Zero-Width Assertions . 该模式包括:

    • 前面有一个[未被捕获(lookbehind);

    • 一个非贪婪的被捕获群体 . 停在第一个位置是不贪心的;和

    • 后跟一个未捕获的(前瞻) .

    或者你可以捕捉方括号之间的内容:

    \[(.*?)\]
    

    并返回第一个捕获的组而不是整个匹配 .

  • 3

    如果您使用 JavaScript ,则由cletus提供的first solution(?<=\[)(.*?)(?=\]) 将无效,因为JavaScript不支持lookbehind运算符 .

    但是,第二个解决方案效果很好,但您需要获取第二个匹配的元素 .

    例:

    var regex = /\[(.*?)\]/;
    var strToMatch = "This is a test string [more or less]";
    var matched = regex.exec(strToMatch);
    

    它将返回:

    ["[more or less]", "more or less"]
    

    所以,你需要的是第二个 Value . 使用:

    var matched = regex.exec(strToMatch)[1];
    

    回来:

    "more or less"
    
  • 8

    你只需要“捕捉”括号之间的位 .

    \[(.*?)\]
    

    grab 你把它放在括号内 . 你没有说这是使用哪种语言 . 例如,在Perl中,您可以使用$ 1变量访问它 .

    my $string ='This is the match [more or less]';
    $string =~ /\[(.*?)\]/;
    print "match:$1\n";
    

    其他语言将有不同的机制 . 例如,C#使用Match collection类,我相信 .

  • 3

    PHP:

    $string ='This is the match [more or less]';
    preg_match('#\[(.*)\]#', $string, $match);
    var_dump($match[1]);
    
  • 341

    要删除[]使用:

    \[.+\]
    
  • 17

    [^\[] 匹配任何不是[ .

    + 匹配1个或更多不是 [ 的任何内容 . 创建这些匹配的组 .

    (?=\]) 积极的向前看 ] . 匹配以 ] 结尾的组,而不将其包含在结果中 .

    完成 .

    [^\[]+(?=\])
    

    证明 .

    http://regexr.com/3gobr

    类似于null提出的解决方案 . 但是不需要额外的 \] . 另外,在 ^ 之后, \ 不需要转义 [ . 为了便于阅读,我会留下它 .

    在分隔符相同的情况下不起作用 . "more or less" 例如 .

  • -1

    我使用正则表达式与bash脚本有同样的问题 . 我使用带有grep -o应用的管道的两步解决方案

    '\[(.*?)\]'
    

    首先,然后

    '\b.*\b'
    

    显然在其他答案上效率不高,但另一种选择 .

  • 0

    这个特别适用于javascript的正则表达式解析器 /[^[\]]+(?=])/g

    只需在控制台中运行它

    var regex = /[^[\]]+(?=])/g;
    var str = "This is a test string [more or less]";
    var match = regex.exec(str);
    match;
    
  • 2

    我想在/和#之间找到一个字符串,但#有时是可选的 . 这是我使用的正则表达式:

    (?<=\/)([^#]+)(?=#*)
    
  • 2

    如果你需要提取没有括号的文本,你可以使用bash awk

    echo " [hola mundo] " | awk -F'[][]' '{print $2}'

    结果:

    hola mundo

相关问题