正则表达式只匹配内部模式?

时间:2014-02-25 10:20:57

标签: java regex

嘿,我有以下字符串:

# The [[state]] that follows [[birth]], and precedes [[death]]; the state of
[[be]]ing [[alive]] and [[live|living]].#

现在我希望找到的是[[live|living]], 我尝试过以下表达式:

\[\[(.*?)\|(.*?)\]\]

问题是它与[[的{​​{1}},正确位置的[[state]]|

的结尾相匹配

如何设置仅获得最内在]] [[模式的模式?也许在]]结束的方括号中排除?如果是这样,怎么办呢?

注意:我正在使用java,因此(.*?)实际上是两倍,但只用一个\

进行了简化

3 个答案:

答案 0 :(得分:0)

在比赛中使用方括号([^\[\]]*)的否定字符类

~\[\[([^\[\]]*)\]\]~

答案 1 :(得分:0)

您尝试匹配两个连续的括号([[),然后是某物(.*?)),然后是管道(|) - 那个<强烈>某事是问题,因为消耗太多,虽然你已经让点非贪婪..

试试这个:

\[\[([^[]*)\|(.*?)\]\]

此模式比使用.的模式更具限制性:子模式[^[]+匹配开头括号的(连续)字符序列。

答案 2 :(得分:0)

  

问题是它与[[的{​​{1}},正确位置的[[state]]|

的结尾相匹配

这是因为你让你的表达式消耗所有东西,只要它不是垂直条。

如果更改表达式以避免在第一组中关闭括号,则应捕获所需的文本:

]]

此更改的另一个积极方面是,它会从正则表达式的评估过程中消除backtracking,这可以显着提高性能。

Demo on ideone.