我正在查看源代码中的正则表达式,我不确定它是否正确。
<<SWE.[^<<]*>>
具体来说,[^<<]
部分是做什么的?我认为括号允许你提供一个范围。它是否排除“&lt;&lt;”或者只是一个“&lt;” ?
如果这是一行正在解析的文本:
<<SWE.SomeText>><<SWE.SomeMoreText>>
我认为作者的意图是有两个匹配而不是一个。
match[0] = <<SWE.SomeText>>
and
match[1] = <<SWE.SomeMoreText>>
而不是
match[0] = <<SWE.SomeText>><<SWE.SomeMoreText>>
有更好的方法吗?那么<<SWE.*?>>
答案 0 :(得分:4)
在我看来,这是一厢情愿的想法。 [^&lt;&lt;]将匹配除&之外的任何内容。是否&lt;&lt;或者&lt;是无关紧要的。 [^&lt;]和[^&lt;&lt;]意思相同。
答案 1 :(得分:2)
我认为你想要的表达是:
<<SWE\.[^>]*>>
这将与你给出的两个例子相符。
答案 2 :(得分:0)
RegexBuddy说:
匹配任何不是“&lt;”的字符 «[^&lt;&lt;] *»
在零和无限之间 时间,尽可能多次, 根据需要回馈(贪婪)«*»
答案 3 :(得分:0)
[^<<]
相当于[^<]
,在字符类中列出两次字符是多余的。我认为它应该是[^>]
,并且正确角括号。此点也应该转义为“\.
”。
我同意你的正则表达式:<<SWE\..*?>>
更好。但是,如果重要的话,非贪婪的运算符可能会导致非匹配字符串意外回溯,而[^>]*
不会涉及任何回溯,因此可能更有效。
答案 4 :(得分:0)
你是对的[^<<]
只排除一个<
;第二个<
是多余的。
当然,最初的目的是确保模式末尾的>>
不贪婪,更好的方法是使用*?
代替{ {1}},与您的最终模式一样,*
。
有一点需要注意,看起来您希望标签中的前缀为“SWE。”,因此除了“任何特征”期间外,您还应该为模式添加转义句点。因此:
<<SWE.*?>>
答案 5 :(得分:0)
你使用什么样的正则表达式?
如果你正在使用异国情调,'&lt;&lt;&lt;和'&gt;&gt;'可以代表字符类的内部和外部的单词边界。
答案 6 :(得分:0)
[^是一个否定的字符类 - 匹配不是这些字符的东西。
这匹配第一个:
&LT;&LT; SWE * GT;?&GT;
匹配一个或多个:
(?:?&LT;&LT; SWE * GT;&GT;)+
这匹配&lt;&lt;之间的所有内容和最后一个&gt;&gt; (包括更多&gt;&gt;'s):
&LT;&LT; SWE * GT;。&GT;