我想查找/匹配不包含两个连续字符作为数字的字符串。
例如,在以下字符串中:
12ab
1ab2
1a2b
ab12
我想选择第 2 和第 3 个字符串 - 1ab2 和 1a2b。
几个小时以来一直在尝试编写匹配器正则表达式:(
非常感谢您的帮助..
最简单的事情就是这样
if ( ! myString.matches( ".*\\d\\d.*" ))
但是如果你想要一个实际的正则表达式,没有外面的“非”逻辑,总有
"\\D*(\\d\\D+)*\\d?"
这匹配任意数量的“数字”字符 ( \d
),前提是每个字符后跟一个或多个“非数字”字符 ( \D
),然后是下一个数字。开头可以有一些非数字,最后可以有一个数字。
您可以使用这个基于前瞻的正则表达式:
"^((?!\\d{2}).)*$"
"11ab2".matches("^((?!\\d{2}).)*$"); // false
"1pab2".matches("^((?!\\d{2}).)*$"); // true
"1pa52".matches("^((?!\\d{2}).)*$"); // false
(?!\\d{2}).
表示匹配一个字符,如果它后面没有 2 位数字。
如果您需要一个在没有两个连续数字时匹配的正则表达式(而不是编写一个匹配器在有两个连续数字时匹配然后使用!
),至少有几种可能性:
(1) 负前瞻:
if (myString.matches ("^(?!.*\\d\\d).*"))
你告诉匹配器,“如果你能找到字符串的开头没有后跟任何字符序列的模式后跟两位数字,请匹配”。
(2) 蛮力:
if (myString.matches ("\\D*(\\d\\D+)*\\d?"))
\\D
匹配任何不是数字的东西。设置后,源中出现的任何数字都必须后跟非数字或字符串的末尾。
编辑:以前的版本有^
and $
,如果你正在使用这是必要的,find
但如果你正在使用matches
.