当我想匹配除5之外的所有数字字符时我使用:
[^\D|5]
或
[^\D5]
或 [0-46-9] 要么 [012346789]
当我想要不匹配任何数字字符时,我可以使用:
[^\d]
或
[\D]
所有这些都运作良好。但是,当我使用[^^\d5]
或[^^\d|5]
匹配除5之外的所有数字字符时,它不起作用。
我想在很多情况下使用它。例如,我想匹配所有\p{P}
但不匹配\:
。有没有办法使用^\d
匹配除5以外的所有数字字符?
答案 0 :(得分:3)
[123467890]
没有理由使用速记版本的所有内容。 它与正则表达式引擎没有区别。
事实上,添加替换|
和零长度断言^
只会降低您的效果。
[0-46-9]
[]
连字符将在字符类中指定范围。您可以查找ASCII表以查看您正在执行的范围,例如:[ -Z]
实际上匹配ASCII 33到127。
好的,现在我对你的要求有了更好的了解 您需要具体说明您需要预先匹配的内容。
你可以使用消极/积极的前瞻来做到这一点:
(?!.*?5.*?)(?!.*?\p{Alpha}.*?)(\p{P}*?$|\p{L}*?$)
这将符合以下条件:
答案 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]
相同的结果。