Regex将小于500英尺的字符串与小数位数进行匹配



我正在尝试使用正则表达式来确定字符串是否包含小于500英尺的值。重要的是,匹配有一些关键的约束和假设:

  • 可以假设逗号已被删除。小数被保证为.而不是,
  • 不能假定数值前面有空格
  • 可以假设"英尺"将被写成"英尺"或"英尺">
  • 可以采用小写
  • 小数可以是任何长度
  • 数字和单词"英尺"或"英尺"之间可能有任意数量的空格

到目前为止我的尝试:

尝试1

b[1-4]{0,1}[0-9]{1,2}(.[0-9]{1,}}){0,1} {0,}(ft|feet)b

这很好,但没有考虑小数,并且匹配值如1000.5英尺(匹配"5英尺")

尝试2

我的下一个尝试是包含一个否定的lookbacking,以确保匹配之前没有.或任何数字。

(?<!(.|[0-9]))([1-4]{0,1}[0-9]{1,2}(.[0-9]{1,}}){0,1} {0,}(ft|feet))b

不幸的是,现在这与任何小数都不匹配(例如,5.5英尺应该匹配,但不匹配)。我怀疑我误解了消极的背后监视是如何运作的。

如果有人能帮我理解我哪里出了问题,我将不胜感激!

测试用例:

  • "1英尺高"-匹配
  • "1英尺高"-匹配
  • "1.1英尺高"-匹配
  • "他有6英尺高"-匹配
  • "499.555英尺高"-匹配
  • "他有2米高"——没有对手
  • "500英尺高"-没有对手
  • "这座建筑有1000.405英尺高"——无与伦比

您可以使用

r"(?<!d.)(?<!d)(?:[1-9]|[1-9]d|[1-4]dd)(?:.d+)?s*f(?:ee)?tb"

查看regex演示

详细信息

  • (?<!d.)(?<!d)-两个负向后看,确保当前位置前没有数字+点或只有一个数字
  • (?:[1-9]|[1-9]d|[1-4]dd)-一个数字
    • [1-9]-从19
    • [1-9]d-从1099
    • [1-4]dd-100499
  • (?:.d+)?-一个可选的非捕获组,匹配一个点和一个以上数字的可选序列
  • s*-0+空白
  • f(?:ee)?t-ftfeet(但不是fet)
  • b-一个单词边界

最新更新