这个正则表达式意味着什么?

时间:2009-07-09 22:07:22

标签: regex

我正在查看源代码中的正则表达式,我不确定它是否正确。

<<SWE.[^<<]*>>

具体来说,[^<<]部分是做什么的?我认为括号允许你提供一个范围。它是否排除“&lt;&lt;”或者只是一个“&lt;” ?

如果这是一行正在解析的文本:

<<SWE.SomeText>><<SWE.SomeMoreText>>

我认为作者的意图是有两个匹配而不是一个。

match[0] = <<SWE.SomeText>>
and
match[1] = <<SWE.SomeMoreText>>

而不是

match[0] = <<SWE.SomeText>><<SWE.SomeMoreText>>

有更好的方法吗?那么<<SWE.*?>>

7 个答案:

答案 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;