你如何匹配正则表达式模式的最后一个出现?
例如,我如何在以下文本中匹配 [XXX]:
data[X][XX][XXX]
其中 X、XX 和 XXX 可以随意指定。
我已尝试使用负向先行断言。
\[.*?\](?!.*?\[.*?\])
但是第一个[与最后一个]匹配将不能给出正确的结果。
你如何匹配正则表达式模式的最后一个出现?
例如,我如何在以下文本中匹配 [XXX]:
data[X][XX][XXX]
其中 X、XX 和 XXX 可以随意指定。
我已尝试使用负向先行断言。
\[.*?\](?!.*?\[.*?\])
但是第一个[与最后一个]匹配将不能给出正确的结果。
.
匹配了 [
和 ]
以及除了换行符之外的任何其他字符。你可以用非贪婪字符类 [^][]
替换懒惰的点:\[[^][]*\](?!.*?\[[^][]*\])
请查看正则表达式演示
根据正则表达式的类型,您可能需要在字符类中转义[
和]
(在JS中,]
必须被转义为[^\][]
,而在Java / ICU中,您需要转义两个符号[^\]\[]
)。
[...]
的较长输入,第一个 .*
可能会导致性能问题。 - Wiktor Stribiżew
[...]
中可能包含]
,则另一种解决方案会很方便:[[^[]*](?!.*?[[^[]*])
。此外,如果您有多行输入,则应将.*?
替换为[\s\S]*?
。 - Wiktor Stribiżew