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

Posted

技术标签:

【中文标题】正则表达式匹配除 5 之外的所有数字字符【英文标题】:Regular expression to match all numeric characters except 5 【发布时间】:2014-03-22 09:07:26 【问题描述】:

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

[^\D|5]

[^\D5]

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

当我不想匹配可以使用的数字字符时:

[^\d]

[\D]

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

我想在很多情况下使用它。例如,我想匹配所有\pP,但不匹配\:。有什么方法可以使用^\d 匹配除5以外的所有数字字符?

【问题讨论】:

怎么样:([0-4]|[6-9]) 您实际上可以使用单个字符类:[0-46-9] @VasiliSyrakis,酷!我不知道!每天学习新事物! :) 没问题。我在下面的答案中添加了有关字符类中连字符的更多信息。 【参考方案1】:

你可以使用这个匹配除 5 之外的所有数字:

[123467890]

没有理由使用所有内容的速记版本。 这对正则表达式引擎没有影响。

事实上,添加alternation| 和零长度断言^ 只会降低你的性能。

更短的版本是:

[0-46-9]

字符类[]中的连字符/破折号行为

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


编辑:

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

您可以使用负/正前瞻来做到这一点:

(?!.*?5.*?)(?!.*?\pAlpha.*?)(\pP*?$|\pL*?$)

这将在以下条件下匹配:

没有数字 5 没有来自 POSIX 类的字符:Alpha 具有 Unicode 属性“字母”或“标点符号”的任何字符

【讨论】:

感谢您的帮助,但我想使用运算符(例如“是数字但不是 5”或“不是((非数字)或 5)”,如 en.wikipedia.org/wiki/De_Morgan's_laws 我可以使用 [^\ D5] 但不能使用 [^^\d5] 如果您只想匹配除 5 以外的任何数字,则没有理由使用 [^^\d5] 我想在很多情况下使用它。例如,我想匹配所有的 \pL 而不是 \pAlpha 怎么办? 我想我明白你在追求什么。请参阅我的答案底部的编辑。【参考方案2】:

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

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

更新:

基于利用德摩根定律并根据 OP 的评论使用逻辑补码的要求,这是我对 [^\D5] 的逻辑补码的解释。

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

那么我们需要的是“(NOT一个非数字字符)AND (NOT 5)”。将此与引用的 Wikipedia 文章中的“(NOT A) AND (NOT B)”进行比较。

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

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

不,它不使用^^ 的双重否定;这不像你发现的那样工作;但是上面的逻辑补码本质上是我们想要的正则表达式-“(NOT一个非数字字符)ANDNOT 5)” -应用于单个字符(即.)。

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

【讨论】:

感谢您的帮助,但我想使用运算符(例如“是数字但不是 5”或“不是((非数字)或 5)”,如 en.wikipedia.org/wiki/De_Morgan's_laws 我可以使用 [^\ D5] 但不能使用 [^^\d5] 好的,我将提供一个更新,我认为是 [^\D5] 的逻辑补充,因为我认为它不是 [^^\d5] @MinhLe:虽然我同意 Vasili Syrakis 作为一个实际问题,但考虑到是否可以这样做只是引起了你的兴趣(因为它引起了我的兴趣),我提供了更新内容我认为是[^\D5] 的真正合乎逻辑的补充。真是个脑筋急转弯! 我想在很多情况下使用它。例如,我想匹配所有 \pL 而不是 \pAlpha 怎么办? 对不起我的英语不好我在这里找到了答案***.com/questions/21928277/…非常感谢!

以上是关于正则表达式匹配除 5 之外的所有数字字符的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式,匹配除 \r \n 之外的所有内容作为普通字符

正则表达式:匹配除特定模式之外的所有内容

正则表达式 - 如何匹配除特定模式之外的所有内容

正则表达式去除除科学记数法之外的所有非数字字符

什么正则表达式将匹配除逗号','或分号';'之外的每个字符?

需要一个正则表达式来删除除数字之外的所有内容