我需要从字符串中提取一组包含在两个分隔符之间的字符,而不返回分隔符本身 .
一个简单的例子应该是有用的:
Target :提取方括号之间的子字符串,而不返回括号本身 .
Base string : This is a test string [more or less]
This is a test string [more or less]
如果我使用以下reg . 恩 .
\[.*?\]
比赛是 [more or less] . 我只需要 more or less (没有括号) .
[more or less]
more or less
有可能吗?
轻松完成:
(?<=\[)(.*?)(?=\])
从技术上讲,这是使用前瞻和外观 . 见Lookahead and Lookbehind Zero-Width Assertions . 该模式包括:
前面有一个[未被捕获(lookbehind);
一个非贪婪的被捕获群体 . 停在第一个位置是不贪心的;和
后跟一个未捕获的(前瞻) .
或者你可以捕捉方括号之间的内容:
\[(.*?)\]
并返回第一个捕获的组而不是整个匹配 .
如果您使用 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"
你只需要“捕捉”括号之间的位 .
grab 你把它放在括号内 . 你没有说这是使用哪种语言 . 例如,在Perl中,您可以使用$ 1变量访问它 .
my $string ='This is the match [more or less]'; $string =~ /\[(.*?)\]/; print "match:$1\n";
其他语言将有不同的机制 . 例如,C#使用Match collection类,我相信 .
PHP:
$string ='This is the match [more or less]'; preg_match('#\[(.*)\]#', $string, $match); var_dump($match[1]);
要删除[]使用:
\[.+\]
[^\[] 匹配任何不是[ .
[^\[]
+ 匹配1个或更多不是 [ 的任何内容 . 创建这些匹配的组 .
+
[
(?=\]) 积极的向前看 ] . 匹配以 ] 结尾的组,而不将其包含在结果中 .
(?=\])
]
完成 .
[^\[]+(?=\])
证明 .
http://regexr.com/3gobr
类似于null提出的解决方案 . 但是不需要额外的 \] . 另外,在 ^ 之后, \ 不需要转义 [ . 为了便于阅读,我会留下它 .
\]
^
\
在分隔符相同的情况下不起作用 . "more or less" 例如 .
我使用正则表达式与bash脚本有同样的问题 . 我使用带有grep -o应用的管道的两步解决方案
'\[(.*?)\]'
首先,然后
'\b.*\b'
显然在其他答案上效率不高,但另一种选择 .
这个特别适用于javascript的正则表达式解析器 /[^[\]]+(?=])/g
/[^[\]]+(?=])/g
只需在控制台中运行它
var regex = /[^[\]]+(?=])/g; var str = "This is a test string [more or less]"; var match = regex.exec(str); match;
我想在/和#之间找到一个字符串,但#有时是可选的 . 这是我使用的正则表达式:
(?<=\/)([^#]+)(?=#*)
如果你需要提取没有括号的文本,你可以使用bash awk
echo " [hola mundo] " | awk -F'[][]' '{print $2}'
结果:
hola mundo
10 回答
轻松完成:
从技术上讲,这是使用前瞻和外观 . 见Lookahead and Lookbehind Zero-Width Assertions . 该模式包括:
前面有一个[未被捕获(lookbehind);
一个非贪婪的被捕获群体 . 停在第一个位置是不贪心的;和
后跟一个未捕获的(前瞻) .
或者你可以捕捉方括号之间的内容:
并返回第一个捕获的组而不是整个匹配 .
如果您使用 JavaScript ,则由cletus提供的first solution,
(?<=\[)(.*?)(?=\])
将无效,因为JavaScript不支持lookbehind运算符 .但是,第二个解决方案效果很好,但您需要获取第二个匹配的元素 .
例:
它将返回:
所以,你需要的是第二个 Value . 使用:
回来:
你只需要“捕捉”括号之间的位 .
grab 你把它放在括号内 . 你没有说这是使用哪种语言 . 例如,在Perl中,您可以使用$ 1变量访问它 .
其他语言将有不同的机制 . 例如,C#使用Match collection类,我相信 .
PHP:
要删除[]使用:
[^\[]
匹配任何不是[ .+
匹配1个或更多不是[
的任何内容 . 创建这些匹配的组 .(?=\])
积极的向前看]
. 匹配以]
结尾的组,而不将其包含在结果中 .完成 .
证明 .
http://regexr.com/3gobr
类似于null提出的解决方案 . 但是不需要额外的
\]
. 另外,在^
之后,\
不需要转义[
. 为了便于阅读,我会留下它 .在分隔符相同的情况下不起作用 .
"more or less"
例如 .我使用正则表达式与bash脚本有同样的问题 . 我使用带有grep -o应用的管道的两步解决方案
首先,然后
显然在其他答案上效率不高,但另一种选择 .
这个特别适用于javascript的正则表达式解析器
/[^[\]]+(?=])/g
只需在控制台中运行它
我想在/和#之间找到一个字符串,但#有时是可选的 . 这是我使用的正则表达式:
如果你需要提取没有括号的文本,你可以使用bash awk
echo " [hola mundo] " | awk -F'[][]' '{print $2}'
结果:
hola mundo