我觉得正则表达式很痛苦。如果我没有找到一个能够完全符合我要求的例子,那么我就迷失了。我希望有人能帮助我。
我有一个这样的字符串:
要显示的一些文字(信息)(更多信息)
我想使用正则表达式来获取第二组括号和文本。或者显示的最后一组。就像这个例子我想抓住:
(更多信息)
到目前为止,我发现了这个:
\((?:[^()])*\)
但这给了我第一套,我无法弄清楚如何获得第二套。
更新 只有当有超过1组括号时才可以选择最后一组括号吗?
一些文字(信息)(更多信息)
应该返回:
(更多信息)
但如果是这样的话:
一些文字(信息)
它不会拿起任何东西
答案 0 :(得分:0)
这将获得字符串中的最后一组括号
单行的\([^()]*\)(?!.*?\([^()]*\))
\([^()]*\)(?![\S\s]*?\([^()]*\))
用于多行
扩展:
\( # Last '(..)'
[^()]*
\)
(?! # Not '(..)' downstream
.*?
\(
[^()]*
\)
)
UPDATE Can I get the last set of brackets to be selected only when there is more than 1 set of brackets?
是。捕获组1的结果
\([^()]*\).*?(\([^()]*\))(?!.*?\([^()]*\))
扩展:
\( # Previous '(..)'
[^()]*
\)
.*?
( # (1 start), Last '(..)'
\(
[^()]*
\)
) # (1 end)
(?! # Not '(..)' downstream
.*?
\(
[^()]*
\)
)
答案 1 :(得分:0)
除非有一些令人信服的理由使用正则表达式,否则您还可以拆分,如下所示:
function last_paren_item(str) {
var pieces = str.split(/(\(.*?\))/);
^-----^ PARENTHESIZED TEXT
^-------^ KEEP SPLITTERS IN RESULT
return pieces[pieces.length-2];
}
这利用了split
的功能,如果包含在正则表达式中的括号(捕获组)中,则分割符包含在结果中。最后一个带括号的部分将始终是该组的最后一个元素。
> var str = "some text to be displayed (info) (more info)";
> var pieces = str.split(/(\(.*?\))/)
< ["some text to be displayed ", "(info)", " ", "(more info)", ""]
> pieces[pieces.length-2]
< "(more info)"
您可能更喜欢这个比正则表达式\([^()]*\)(?!.*?\([^()]*\))
更具可读性。