正则表达式匹配除5之外的所有数字字符

时间:2014-02-21 03:03:40

标签: c# java regex

当我想匹配除5之外的所有数字字符时我使用:

[^\D|5]

[^\D5]

或         [0-46-9] 要么         [012346789]

当我想要不匹配任何数字字符时,我可以使用:

[^\d]

[\D]

所有这些都运作良好。但是,当我使用[^^\d5][^^\d|5]匹配除5之外的所有数字字符时,它不起作用。

我想在很多情况下使用它。例如,我想匹配所有\p{P}但不匹配\:。有没有办法使用^\d匹配除5以外的所有数字字符?

2 个答案:

答案 0 :(得分:3)

您可以使用以下数字匹配除5之外的所有数字:

[123467890]

没有理由使用速记版本的所有内容。 它与正则表达式引擎没有区别。

事实上,添加替换|和零长度断言^只会降低您的效果。

较短的版本是:

[0-46-9]

字符类[]

内的连字符/短划线行为

连字符将在字符类中指定范围。您可以查找ASCII表以查看您正在执行的范围,例如:[ -Z]实际上匹配ASCII 33到127。


编辑:

好的,现在我对你的要求有了更好的了解 您需要具体说明您需要预先匹配的内容。

你可以使用消极/积极的前瞻来做到这一点:

(?!.*?5.*?)(?!.*?\p{Alpha}.*?)(\p{P}*?$|\p{L}*?$)

这将符合以下条件:

  • 没有数字5
  • POSIX类中没有字符:Alpha
  • 具有Unicode属性“letter”或“punctuation”
  • 的任何字符

答案 1 :(得分:0)

\d只是[0-9]。请参阅Java regex reference进行确认。

只需使用[0-46-9]即可。您可以在regex fiddle中尝试。

<强>更新

根据要求利用De Morgan定律并根据OP的评论使用逻辑补语,这是我对[^\D5]的逻辑补语的解释。

[^\D5]实质上是指“ NOT (非数字字符 OR 5)”。将其与引用的Wikipedia article on De Morgan's laws中的“ NOT (A OR B)”进行比较。

我们需要的是“( NOT 非数字字符) AND NOT 5)”。在引用的维基百科文章中将其与“( NOT A) AND NOT B)”进行比较。

然后,我的解释是使用a sequence of lookahead expressions for logical ANDing逻辑补充[^\D5]

(?!\D)(?!5).

不,它不使用^^的双重否定;这不起作用,因为你发现;但上述逻辑补语本质上意味着我们在正则表达中想要的东西 - “( NOT 非数字字符) AND NOT 5)” - 应用于单个字符(即.)。

您可以在follow-on regex fiddle中看到上述逻辑补语产生与[^\D5]相同的结果。