我有这样的文字;
[Some Text][1][Some Text][2][Some Text][3][Some Text][4]
我想将[Some Text][2]
与此正则表达式匹配;
/\[.*?\]\[2\]/
但它会返回[Some Text][1][Some Text][2]
我如何仅匹配[Some Text][2]
?
注意:某些文字中可能包含[
和]
中的任何字符。方括号中的数字可以是任何数字,而不仅仅是1和2.我想要的Some Text
匹配可以在行的开头,并且可以有多个Some Text
s
答案 0 :(得分:0)
答案 1 :(得分:0)
\[.*?\]\[2\]
模式works like this:
\[
-查找最左边的[
(正则表达式引擎从左到右处理字符串输入).*?
-匹配除换行符以外的任何0+字符,尽可能少,但满足成功匹配所需的数目,以及后续模式,请参见下文\]\[2\]
-][2]
子字符串。因此,.*?
在每次失败时都会扩展,直到找到最左边的][2]
。 请注意,延迟量词不能保证“最短”匹配。。
解决方案
使用否定字符类而不是.*?
(或.*
),该字符类可以匹配除边界char以外的任何字符。
\[[^\]\[]*\]\[2\]
请参见this regex demo。
在这里,.*?
被[^\]\[]*
所取代-除]
和[
以外的0个或更多字符。
其他示例:
<[^<>]*>
匹配<...>
,内部没有<
和>
\([^()]*\)
匹配(...)
且内部没有(
和)
的"[^"]*"
匹配"..."
,内部没有"
在其他情况下,当起始模式是多字符字符串或复杂模式时,请使用tempered greedy token,(?:(?!start).)*?
。要匹配abc 1 def
中的abc 0 abc 1 def
,请使用abc(?:(?!abc).)*?def
。