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

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

一个简单的例子应该有帮助:

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

基本字符串这是一个测试字符串[或多或少]

如果我使用下面的注册表。 恩。

  \ [*?\] 

这场比赛是[或多或少] 。 我只需要更多或更少 (没有括号)。

可以做到吗?

轻松完成:

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

从技术上讲,这是使用向前看和向后看。 请参阅Lookahead和Lookbehind零宽度断言 。 该模式包括:

  • 前面有一个[没有被捕获(向后看);
  • 一个非贪婪的捕获组。 第一次停下来是不贪心的; 和
  • 后面是一个]没有被捕获(前瞻)。

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

 \[(.*?)\] 

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

如果使用JavaScript ,由cletus提供的第一个解决方案 (?<=\[)(.*?)(?=\])将不起作用,因为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"] 

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

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

回来:

 "more or less" 

你只需要“捕捉”括号内的位。

 \[(.*?)\] 

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

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

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

PHP:

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

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

  '\[(.*?)\]' 

首先,然后

 '\b.*\b' 

显然,其他答案效率不高,但是可以选择。

要删除[]使用:

 \[.+\] 

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

只需在控制台中运行这个

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

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

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

(?=\])积极的前瞻] 。 匹配以[ ]结尾的组]而不包括在结果中。

完成。

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

证明。

http://regexr.com/3gobr

类似于null提出的解决方案。 但是额外的\]不是必需的。 作为补充说明,看起来\并不需要在[ ^之后转义[ 。 为了便于阅读,我会把它放在里面。

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

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

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

结果:

hola mundo