首页 > 解决方案 > 使正则表达式因无效输入而失败

问题描述

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

我的正则表达式如下:

(\d)(\d?)(.?)(\d?)(\d?)(c)(m)

但是,如果我将 height 作为71-80cm传递,则正则表达式也会返回true

当高度为71-80cm时,我应该对正则表达式进行哪些更改以返回 false ?

标签: javaregex

解决方案


我假设 OP 希望匹配表单的子字符串

abcm

在哪里:

  • "cm"是字面量;
  • "cm"后面没有字母;
  • "b"是非负浮点数或整数的字符串表示形式(例如,"80""80.25",但不是"08"".25");和
  • "a"是除 , 之外的字符"-""+"并且".", 除非"b"在字符串的开头,在这种情况下"a"是空字符串。

如果我的假设是正确的,您可以使用以下正则表达式来b匹配abcm

(?<![-+.\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

如果我对所需内容的假设不正确,那么如何适当调整我的答案可能很明显。


推荐阅读