2008-10-16 58 views
11

我有这个正则表达式我建立和正则表达式伙伴测试。什么是“嵌套量化器”,为什么它会导致我的正则表达式失败?

"_ [ 0-9]{10}+ {1}+[ 0-9]{10}+ {2}+[ 0-9]{6}+ {2}[ 0-9]{2}" 

当我在.net C#中使用此

我收到异常

"parsing \"_ [ 0-9]{10}+ +[ 0-9]{10}+ +[ 0-9]{6}+ [ 0-9]{2}\" - Nested quantifier +." 

这个错误是什么意思?显然.net不喜欢这个表情。

这里是正则表达式的好友,这样你们可以理解我的意图与正则表达式...

_ [ 0-9]{10}+ {1}+[ 0-9]{10}+ {2}+[ 0-9]{6}+ {2}[ 0-9]{2} 

Match the characters "_ " literally «_ » 
Match a single character present in the list below «[ 0-9]{10}+» 
    Exactly 10 times «{10}+» 
    The character " " « » 
    A character in the range between "0" and "9" «0-9» 
Match the character " " literally « {1}+» 
    Exactly 1 times «{1}+» 
Match a single character present in the list below «[ 0-9]{10}+» 
    Exactly 10 times «{10}+» 
    The character " " « » 
    A character in the range between "0" and "9" «0-9» 
Match the character " " literally « {2}+» 
    Exactly 2 times «{2}+» 
Match a single character present in the list below «[ 0-9]{6}+» 
    Exactly 6 times «{6}+» 
    The character " " « » 
    A character in the range between "0" and "9" «0-9» 
Match the character " " literally « {2}» 
    Exactly 2 times «{2}» 
Match a single character present in the list below «[ 0-9]{2}» 
    Exactly 2 times «{2}» 
    The character " " « » 
    A character in the range between "0" and "9" «0-9» 

总之...

什么是嵌套量词?

回答

9

.NET在{n}样式量词后抱怨+,因为它没有任何意义。 {n}表示与给定组完全匹配。表示匹配一个或多个给定的组。删除+的,它会很好地编译。

"_ [ 0-9]{10} {1}[ 0-9]{10} {2}[ 0-9]{6} {2}[ 0-9]{2}" 
+2

在某些正则表达式中,{min,max} +是占有量词,但.Net不支持它们。如果您使用的是正则表达式好友,您可以通过右键单击合成窗格并从下拉列表中选择“风味”来告诉它正在使用哪种正则表达式。 – Grokodile 2011-06-24 15:57:21

2

他们是对的。这是你的正则表达式的版本不失败:

(_ [ 0-9]{10})+(\s{1})+([ 0-9]{10})+(\s{2})+([ 0-9]{6})+\s{2}[ 0-9]{2}

注意使用括号的创建,然后可以重复一次或多次群体。此外,你应该更具体,并使用\ s而不是空格,因为模式空格可能有或没有意义。

顺便说一下,这个正则表达式看起来并不是那么有用。你可能想问另一个问题:“如何使用正则表达式来匹配这种模式?”

+0

嗯,这只是一个片段,完整的正则表达式是... _ [0-9] {10} {1} [0-9] {10} {2} [0-9] {6} {2 } [0-9] {2} | _ [0-9] {10} {1} [0-9] {10} {2} [0-9] {6} {2} [0-9] { 2} | _ [0-9] {10} {1} [0-9] {10} {2} [0-9] {6} {2} [0-9] {2} 其返回字段只要一个不是空白的...我喜欢这个想法。谢谢 – ctrlShiftBryan 2008-10-16 20:57:39

+0

我几乎肯定了正则表达式可能会在bigtime下缩小。严重的是,问一个关于如何做的问题并提供一些示例数据。 – Will 2008-10-16 21:01:54

11

.NET不支持possessive quantifier

{10}+ 

然而,{10}应该有完全一样的效果。如果最长匹配失败,+避免回溯并尝试更短的匹配,但由于{10}只能匹配恰好10个字符,所以开始时并不会取得太大的结果。

"_ [ 0-9]{10} [ 0-9]{10} {2}[ 0-9]{6} {2}[ 0-9]{2}" 

应该没问题。我也放弃了“{1} +”位。由于它只匹配一次,“A {1} +”等同于“A”。

编辑 作为Porges说,如果你确实需要在.NET中占有量词,那么原子团给人以(>[0-9]*)相同的功能等同于[0-9]*+

2

如果您在RegexBuddy的顶部工具栏中选择.NET风格,则RegexBuddy会指出.NET不支持{10} +等所有格量词。

由于{10}只允许一个特定的重复次数,因此即使它在支持懒惰和/或占有量词的正则表达式中在语法上是有效的,使它变懒或占有也没有意义。从正则表达式中删除+符号将使它在.NET中正常工作。

在其他情况下,双击RegexBuddy中“创建”选项卡中关于占有量词的错误。然后RegexBuddy将用一个功能相当的原子组替换占有量词。

如果您在RegexBuddy的使用选项卡上为.NET语言生成源代码片段,RegexBuddy将自动替换源代码片段中正则表达式中的占有量词。

相关问题