Java 使正则表达式因无效输入而失败

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

在Java中使用正则表达式进行验证后,我需要为具有值的高度返回true:

  • 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高度验证失败