Java 使正则表达式因无效输入而失败
在Java中使用正则表达式进行验证后,我需要为具有值的高度返回true:Java 使正则表达式因无效输入而失败,java,regex,Java,Regex,在Java中使用正则表达式进行验证后,我需要为具有值的高度返回true: 80厘米 80.2厘米 80.25厘米 我的正则表达式如下所示: (\d)(\d?)(\d?)(\d?)(\d?)(c)(m) 但是,如果我将高度传递为71-80cm,则正则表达式也将返回true 当高度为71-80cm时,我应该对正则表达式进行什么更改以返回false?匹配任何字符,因此您需要使用\.或仅使用\.,具体取决于源代码。退房: 此外,还需要进行额外的更改,例如,如果您需要,则不接受8025cm。我假设O
- 80厘米
- 80.2厘米
- 80.25厘米
(\d)(\d?)(\d?)(\d?)(\d?)(c)(m)
但是,如果我将高度传递为71-80cm,则正则表达式也将返回true
当高度为71-80cm时,我应该对正则表达式进行什么更改以返回false?
匹配任何字符,因此您需要使用\.
或仅使用\.
,具体取决于源代码。退房:
此外,还需要进行额外的更改,例如,如果您需要,则不接受
8025cm
。我假设OP希望匹配表单的子字符串
abcm
其中:
是一个文本李>“cm”
后面没有字母李>“cm”
是非负浮点或整数的字符串表示形式(例如,“b”
或“80”
,但不是“80.25”
或“08”
);及”.25”
是除“a”
、“-”
和“+”
以外的字符,除非“
位于字符串的开头,在这种情况下,“b”
是空字符串“a”
abcm
中的b
:
(?<![-+.\d])[1-9]\d*(?:\.\d+)?cm(?![a-zA-Z])
(?
正则表达式引擎执行以下操作:
(?<! # begin negative lookbehind
[-+.\d] # match '-', '+', '.' or a digit
) # end negative lookbehind
[1-9] # match digit other than zero
\d* # match 0+ digits
(?:\.\d+) # match '.' followed by 1+ digits in a non-cap grp
? # optionally match non-cap grp
cm # match 'cm'
(?![a-zA-Z]) # match a letter in a negative lookahead
(?
如果我对所需内容的假设不正确,那么很明显我的答案可以适当调整。好的,让我们把你的表达式整理一下。你不需要所有的捕获组(…)
,因为您感兴趣的是验证完整的字符串。因此,您还应该将表达式括在行首^
和行尾$
锚定中,这样您的表达式就不能在更大的字符串中匹配。最后,您可以将句点和尾随数字组合在一起(?:)
,因为根据您的示例数据,如果没有另一个,您将无法获得一个。这让我们:
^\d\d?(?:\。\d\d?)cm$
看
然后在Java中,该检查可以如下所示:
boolean foundMatch=subjectString.matches(“^\\d\\d”(?:\\\.\\d\\d?)?cm$”;
将
更改为\。
因为一个未经scaped的
几乎匹配所有内容。您给出了三个您希望匹配的字符串示例。您可能也想匹配其他字符串。您向我们展示了一个您不想匹配的字符串,但这会在无人区留下几乎无限的字符串。您是否希望nt匹配“80cm”
?“80cmmm”
?“-80.2cm”
“差异是-80.2cm”
?“08cm”
?。您需要告诉我们要匹配的字符串模式……下面是一个示例(可能是您想要的,也可能不是您想要的):“我希望匹配”abcm“
后面不跟字母,其中,”cm“
是一个文字,”b“
是非负浮点或整数的字符串表示形式(例如,”80“
或”80.25“
,但不是”08“
或”.25“
)而”a“
是”以外的字符
和“
”,除非“b”
在字符串的开头,在这种情况下“a”
是空字符串"。请编辑您的问题以进行澄清。将此视为编写代码规范的实践,您必须做到精确。对于回答此问题的人:逃过句号只是此表达式问题的一个方面,链接的问题绝不能解决所有问题。感谢Pete&Dawood。逃过圆点。即\\,而不是使用新的正则表达式(\d)(\d?)(\.?)(\d?)(\d?)(\d?)(\d?)(c)(m),dot.made高度验证失败