【问题标题】:Regex: excluding results based on non capture group?正则表达式:排除基于非捕获组的结果?
【发布时间】:2016-04-23 02:08:05
【问题描述】:

所以我正在尝试使用以下正则表达式来匹配有效价格的模式

^\$[1-9]\d{0,2}(?:\,\d{3})?(?:\.\d{2})?

(源自关于 SO 的另一个问题)

匹配的约束条件:

  1. $1.00 <= price <= $999,999.99
  2. 不需要小数位($1$1.00 一样有效)
  3. 小数点后一位数无效($1.1$2.9 等)
  4. 小数点后 3 位以上无效($1.111$2.999 等)

上述模式可以处理前两个约束,但不能处理其他约束。问题是在 (3)(4) 的情况下,小数点之前的价格部分是匹配的。

例如:

 $100,000.4 matches to $100,000
 $200,000.444 matches to $200,000.44

我该如何修改它,以便在 (3)(4) 的情况下整个字符串不匹配?

【问题讨论】:

    标签: python regex string validation


    【解决方案1】:

    简单!只需在最后添加([^,.\d$]|$),这样正则表达式解析器就可以工作到最接近的值,而不是数字、逗号、点或美元。或者它已经在字符串的末尾了。

    ^\$[1-9]\d{0,2}(?:\,\d{3})?(?:\.\d{2})?([^,.\d$]|$)
    

    Demo

    【讨论】:

    • 如果价格不一定用空格分隔,有没有办法让它工作?就像一个价格结束并直接流入下一个价格?
    • 因为下一个价格的美元符号 $ 被上一个匹配消耗掉了,所以会漏掉一些事件。
    • 给出出现的样本。如果正确也请采纳
    【解决方案2】:

    您可以使用 Negative Lookahead (?![\d.,]) 断言匹配价格后没有数字、逗号或点:

    \$[1-9]\d{0,2}(?:,\d{3})?(?:\.\d{2})?(?![\d.,])
    

    Regex 101 demo.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 2018-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多