正则表达式查找包含在两个字符之间的字符串,同时排除分隔符
我需要从字符串中提取一组包含在两个分隔符之间的字符,而不必自己返回分隔符。
一个简单的例子应该有帮助:
目标 :提取方括号之间的子字符串,而不返回括号本身。
基本字符串 : 这是一个测试字符串[或多或少]
如果我使用下面的注册表。 恩。
\ [*?\]
这场比赛是[或多或少] 。 我只需要更多或更少 (没有括号)。
可以做到吗?
轻松完成:
(?<=\[)(.*?)(?=\])
从技术上讲,这是使用向前看和向后看。 请参阅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个或更多不是[
的任何内容。 创建这些匹配的组。
(?=\])
积极的前瞻]
。 匹配以[ ]
结尾的组]
而不包括在结果中。
完成。
[^\[]+(?=\])
证明。
类似于null提出的解决方案。 但是额外的\]
不是必需的。 作为补充说明,看起来\
并不需要在[
^
之后转义[
。 为了便于阅读,我会把它放在里面。
在分隔符相同的情况下不起作用。 例如"more or less"
。
如果你需要提取没有括号的文本,你可以使用bash awk
echo " [hola mundo] " | awk -F'[][]' '{print $2}'
结果:
hola mundo