正则表达式:匹配最后一个模式

4

你如何匹配正则表达式模式的最后一个出现?

例如,我如何在以下文本中匹配 [XXX]:

data[X][XX][XXX]

其中 X、XX 和 XXX 可以随意指定。

我已尝试使用负向先行断言。

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

但是第一个[与最后一个]匹配将不能给出正确的结果。

2个回答

5
你得到这样的结果是因为 . 匹配了 [] 以及除了换行符之外的任何其他字符。你可以用非贪婪字符类 [^][] 替换懒惰的点:
\[[^][]*\](?!.*?\[[^][]*\])

请查看正则表达式演示

根据正则表达式的类型,您可能需要在字符类中转义[](在JS中,]必须被转义为[^\][],而在Java / ICU中,您需要转义两个符号[^\]\[])。


1
如果您的[...]中可能包含],则另一种解决方案会很方便:[[^[]*](?!.*?[[^[]*])。此外,如果您有多行输入,则应将.*?替换为[\s\S]*? - Wiktor Stribiżew

0

你可以尝试这个简单的方法:

.*(\[.*\])

它将匹配到最后一次出现,但会在第一组中捕获最后一个[anything]的出现,并且不必向前查看

解释


我更喜欢使用这种模式而不是我的模式,但有一个前提条件:输入字符串已知为短字符串。对于任意位置的最后一个 [...] 的较长输入,第一个 .* 可能会导致性能问题。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接