代码之家  ›  专栏  ›  技术社区  ›  Diego

查找包含在两个字符之间的字符串,同时不包括分隔符的正则表达式

  •  232
  • Diego  · 技术社区  · 16 年前

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

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

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

    基线串 : This is a test string [more or less]

    如果我使用以下注册。前任。

    \[.*?\]

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

    有可能吗?

    10 回复  |  直到 7 年前
        1
  •  355
  •   cletus    16 年前

    容易做到的:

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

    从技术上讲,这是使用lookaheads和lookbehinds。见 Lookahead and Lookbehind Zero-Width Assertions . 该模式包括:

    • 前面有一个[未捕获的(lookback);
    • 一个非贪婪的被俘虏的群体。一开始就停下来是不贪婪的);
    • 后面跟着一个]未捕获(向前看)。

    或者,您可以只捕获方括号之间的内容:

    \[(.*?)\]
    

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

        2
  •  43
  •   Community Mohan Dere    9 年前

    如果您正在使用 JavaScript , the first solution 由克莱特斯提供, (?<=\[)(.*?)(?=\]) ,将不起作用,因为javascript不支持lookback运算符。

    然而,第二个解决方案工作得很好,但是您需要得到第二个匹配的元素。

    例子:

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

    它会回来:

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

    所以,你需要的是第二个值。用途:

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

    返回:

    "more or less"
    
        3
  •  17
  •   cletus    16 年前

    你只需要“捕获”括号之间的位。

    \[(.*?)\]
    

    为了捕捉你把它放在括号里。你不能说这是用哪种语言。例如,在Perl中,您可以使用$1变量访问它。

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

    其他语言将有不同的机制。例如,C使用 Match collection 我想是上课吧。

        4
  •  8
  •   realloc powtac    12 年前

    PHP:

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

    [^\[] 匹配任何不是[]的字符。

    + 匹配一个或多个不匹配的 [ .创建这些匹配项的组。

    (?=\]) 积极的展望 ] . 匹配以结尾的组 ] 不包括在结果中。

    完成。

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

    证明。

    http://regexr.com/3gobr

    类似于空值提出的解决方案。但是附加的 \] 不是必需的。作为附加说明,它显示 \ 不需要逃离 [ ^ .为了可读性,我会把它放在里面。

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

        6
  •  3
  •   Cătălin Rădoi    11 年前

    要同时删除[]请使用:

    \[.+\]
    
        7
  •  3
  •   null    9 年前

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

    在控制台中运行这个

    var regex = /[^[\]]+(?=])/g;
    var str = "This is a test string [more or less]";
    var match = regex.exec(str);
    match;
    
        8
  •  2
  •   A. Jesús    11 年前

    我在使用regex和bash脚本时也遇到了同样的问题。 我用了一个两步的解决方案,使用带有grep-o应用程序的管道

     '\[(.*?)\]'  
    

    首先,然后

    '\b.*\b'
    

    显然,在其他答案上没有那么有效,而是另一种选择。

        9
  •  0
  •   techguy2000    7 年前

    我想找到一个介于/和之间的字符串,但有时是可选的。这是我使用的regex:

      (?<=\/)([^#]+)(?=#*)
    
        10
  •  -1
  •   Nico    11 年前

    如果需要提取不带括号的文本,可以使用bash awk

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

    结果:

    hola mundo