带有贪婪量词的Java模式正则表达式减法
我目前正在尝试使用正则表达式来验证我的输入是否具有某种格式。 在可能的输入中,只有一个我不想匹配的字符组合。 因此,我想使用中描述的减法 [a-z&&[^bc]]a到z,b和c除外:[ad-z](减法) 因此,可以从表达式中排除特定的字符模式。 不幸的是,我没能正确使用正则表达式 该模式应匹配正好由8位数字组成的字符串([0-9]{8})。此外,它不应与正好包含8个零字符的字符串匹配带有贪婪量词的Java模式正则表达式减法,java,regex,string,subtraction,Java,Regex,String,Subtraction,我目前正在尝试使用正则表达式来验证我的输入是否具有某种格式。 在可能的输入中,只有一个我不想匹配的字符组合。 因此,我想使用中描述的减法 [a-z&&[^bc]]a到z,b和c除外:[ad-z](减法) 因此,可以从表达式中排除特定的字符模式。 不幸的是,我没能正确使用正则表达式 该模式应匹配正好由8位数字组成的字符串([0-9]{8})。此外,它不应与正好包含8个零字符的字符串匹配 12345678->匹配是 00000001->匹配是 00000000->macth编号 我就是这样尝试的
- 12345678->匹配是
- 00000001->匹配是
- 00000000->macth编号
如果有人能帮我,那就太好了。那样的话,你最好有一个: 字符类始终匹配某个集合中的单个字符,并且该集合在方括号之间的表达式中定义,这就是为什么您的方法不起作用
[[0-9]{8}]&&[^[0{8}]]
实际上是指
[[0-9]{8} # Match 8 characters between 0 and 9 or a "["
]&& # Match literal "]&&"
[^[0{8}] # Match a character except "[", "0", "{", "8", or "}"
] # Match a literal "]"
没有查找功能的解决方案必须确保至少存在一个非零位数,同时仍然确保总位数正好为8。这使得问题变得复杂:
^(?:[1-9][0-9]{7}|[0-9][1-9][0-9]{6}|[0-9]{2}[1-9][0-9]{5}|[0-9]{3}[1-9][0-9]{4}|[0-9]{4}[1-9][0-9]{3}|[0-9]{5}[1-9][0-9]{2}|[0-9]{6}[1-9][0-9]|[0-9]{7}[1-9])$
说明:
^#字符串的开头
(?:#小组开始
[1-9][0-9]{7}#匹配数字>0,后跟7位
|#或
[0-9][1-9][0-9]{6}#匹配任何数字,一个数字1-9,其他6个数字
|#或
[0-9]{2}[1-9][0-9]{5}#匹配两位数字,一位数字1-9,另外五位数字
|#或
等等等等等等。
)#小组结束
$#字符串末尾
如果内存可用,可以使用一对括号定义一组要匹配的字符。如果将组的值保存到以后不重要,请在开始时添加?:
。您好,不幸的是,如果try:regex=“?:[[0-9]{8}]&&&[^[0{8}]],则无法工作。但也许我不明白你的意思。是的,我不是这个意思。不过,你最好还是听蒂姆的回答。太好了!谢谢你的帮助,很有效。没有其他解决办法了吗。或者你能告诉我为什么我的方法是错误的吗?@milius:当然还有其他的解决方案,但它们会更复杂。您的方法不起作用,因为字符类减法用于缩短类可以匹配的有效字符列表,而不是正则表达式可以匹配的有效字符列表-这就是查找断言的作用。另请参见我对上述正则表达式的解释。我将很快添加一个替代解决方案,向您展示为什么这种方法是最好的。
^(?:[1-9][0-9]{7}|[0-9][1-9][0-9]{6}|[0-9]{2}[1-9][0-9]{5}|[0-9]{3}[1-9][0-9]{4}|[0-9]{4}[1-9][0-9]{3}|[0-9]{5}[1-9][0-9]{2}|[0-9]{6}[1-9][0-9]|[0-9]{7}[1-9])$