如何处理嵌套量词的解析?

时间:2010-12-28 08:39:36

标签: c# .net regex

我的代码为

Regex regExValue = new Regex(cirtText.Properties.Mask.EditMask);

但我得到一个例外

  

消息:解析   “((WWW)。([A-ZA-Z0-9] {1,6} +。+)* [A-ZA-Z] {2,6-})”    - 嵌套量词+。

任何人都可以让我知道解决方案吗?

4 个答案:

答案 0 :(得分:3)

这里有两个量词{1,6}(仅1到6之间)和+(至少1)。那是你的错误。你需要选择一个。

[a-zA-Z0-9]{1,6}+

无论如何,你可能想写这样的正则表达式:

((www)\.([a-zA-Z0-9]{1,6}\.)*[a-zA-Z]{2,6})

答案 1 :(得分:1)

我不知道C#正则表达式或你想要做什么(即:编辑,验证,等等)
我知道Perl,所以我会捅它。
在正则表达式中,一个时期是一个元字符。如果你想要一个文字时期,你必须逃避
它带有'。'元时期表示匹配任何角色。如果你想要一个文字句号,
为了保留你拥有的东西,在Perl中你不应该双引用正则表达式或逃避
逃亡。单引号应该可以正常工作     '((www)\.([a-zA-Z0-9]{1,6}+\.+)*[a-zA-Z]{2,6})'

现在,除非你想要多个文字句号,否则你应该摆脱+量词   '((www)\.([a-zA-Z0-9]{1,6}+\.)*[a-zA-Z]{2,6})'

如前所述,{n,m}本身就是一个量词。在它之后添加+是双量词 在Perl中,在量词意味着一个积极的条件之后加上+并且在版本5.10中是合法的 所以,摆脱额外+它现在是     '((www)\.([a-zA-Z0-9]{1,6}\.)*[a-zA-Z]{2,6})'

最后,*量词意味着0次或更多次。你为什么要匹配0次?
修复它现在是
    '((www)\.([a-zA-Z0-9]{1,6}\.)+[a-zA-Z]{2,6})'

作为一个额外的,你有一个主要的分组围绕一切,围绕www和一个分组 在中间([a-zA-Z0-9] {1,6}。)+在捕获中没有好处,只是在分组中。
如果要捕获开头,中间,结尾,则应添加适当的捕获
    '((www\.)(([a-zA-Z0-9]{1,6}\.)+)([a-zA-Z]{2,6}))'

或者,在Perl中,这样写得更好     '((www\.)((?:[a-zA-Z0-9]{1,6}\.)+)([a-zA-Z]{2,6}))'

答案 2 :(得分:0)

正如其他人所提到的,拥有两个连续的量词是没有意义的。看起来你可能想说“这些一到六个字符组中的一个或多个”;你有可能省略括号吗?如果这就是你的意思,这很容易解决:

(请注意,在.NET正则表达式中,如果你真的想要一个点,你必须逃避这段时间,否则它将匹配任何东西)

@"((www)\.(([a-zA-Z0-9]{1,6}+)\.+)*[a-zA-Z]{2,6})"

答案 3 :(得分:0)

您可以访问此处link text

了解如何将正则表达式用作Mask。说实话,你的问题不是关于正则表达式。您的演示代码存在一些特殊性,这表明DevExpress实现了RegEx和Masks。你可能想检查那里。即:

的DevExpress

有关正则表达式的更多信息,请参阅“掩码类型:完整” 功能正则表达式“文档在帮助文档中 XtraEditors库。

您看起来正在使用DevExpress与.Net的Regex类。但DevExpress似乎有自己的实现。

此外,通过量词的重复输入可能与掩码有关。无论如何,你可以尝试这个,但它只是一个猜测:

'www\.(([a-zA-Z0-9]{1,6}\.?)+)*\.[a-zA-Z]{2,6}'