代码之家  ›  专栏  ›  技术社区  ›  Nick

regex匹配字符串中小于500英尺的小数位

  •  2
  • Nick  · 技术社区  · 6 年前

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

    • 可以假定逗号已被剥离。小数保证为 . 而不是 ,
    • 不能假定数值前面有空格。
    • 可以假设“英尺”将写为“英尺”或“英尺”
    • 可以采用小写
    • 小数可以是任意长度
    • 数字和单词“feet”或“ft”之间可能有任意数量的空格。

    迄今为止我的尝试:

    尝试1

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

    这很好,但无法解释小数点,无法匹配1000.5英尺(匹配“5英尺”)这样的值。

    尝试2

    我的下一个尝试是包括一个负面的回顾,以确保比赛之前没有 . 或者任何号码。

    (?<!(\.|[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英尺”-不匹配
    1 回复  |  直到 6 年前
        1
  •  1
  •   Wiktor Stribiżew    6 年前

    您可以使用

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

    regex demo

    细节

    • (?<!\d\.)(?<!\d) -两个否定的查找表,确保在当前位置之前没有数字+点或数字。
    • (?:[1-9]|[1-9]\d|[1-4]\d\d) -一个数字
      • [1-9] -来自 1 9
      • [1-9]\d -来自 10 99
      • [1-4]\d\d - 100 499
    • (?:\.\d+)? -一个可选的非捕获组,匹配一个点的可选序列,然后是1+位。
    • \s* -0+空格
    • f(?:ee)?t - ft feet (但不是) fet )
    • \b -单词边界。