正则表达式捕获一个数字,如果没有后跟连字符或单词“to”

时间:2016-09-14 07:37:13

标签: ruby-on-rails regex

我想使用正则表达式来捕获文本中的单个数字,只要它不跟随或跟在“ - ”或“to”之后。例如:

  1. 这是一个不应单独捕获数字500 - 600的示例。
  2. 这是另一个不应单独捕获数字500到600的例子。
  3. 这是一个应该捕获600的示例。
  4. 因此,在示例1和2中,不应单独捕获数字500和600,因为 - 并且包含在数字500-600之间,但是应该捕获整个字符串“500-600”。 在示例3中,应捕获数字600。我的问题是示例1和2中的数字是单独捕获的,而我需要在包含“ - ”时捕获整个字符串“500 - 600”,如果不包含则单独捕获数字。

    我尝试过类似的东西,但它不起作用。我想我需要前瞻和落后?

    ((?:[\p{P}-[-.,\]]\s*|to\s*)\d+\.?\d*(?:\s*[\p{P}-[-.,\]]\s*|\s*to))
    

1 个答案:

答案 0 :(得分:2)

使用替换组并将更具体的number - numbernumber to number模式作为第一个替代分支,并仅匹配第二个分支中的独立数字:

s.scan(/\d+ *(?:-|to) *\d+|\d+/)

或 - 匹配任何空格

s.scan(/\d+\s*(?:-|to)\s*\d+|\d+/)

请参阅Ruby demo

请注意,一旦第一个替代匹配,则不会尝试第二个,因为这是NFA正则表达式替换的工作方式。请参阅Remember That The Regex Engine Is Eager section at the Alternation with The Vertical Bar or Pipe Symbol

<强>详情:

范围替代分支:

  • \d+ - 一位或多位
  • \s* - 零个或多个空格
  • (?:-|to) - -to字符序列
  • \s*\d+ - 0+空格,然后是1+位数

独立号码替代分支:

  • \d+ - 一位或多位数。

注意(基于comment):

而不是-,您可能希望使用\p{Pd},匹配的Punctuation, Dash unicode character category

Character   Name                                    Browser
U+002D      HYPHEN-MINUS                            -
U+058A      ARMENIAN HYPHEN                         ֊
U+05BE      HEBREW PUNCTUATION MAQAF                ־
U+1400      CANADIAN SYLLABICS HYPHEN               ᐀
U+1806      MONGOLIAN TODO SOFT HYPHEN              ᠆
U+2010      HYPHEN                                  ‐
U+2011      NON-BREAKING HYPHEN                     ‑
U+2012      FIGURE DASH                             ‒
U+2013      EN DASH                                 –
U+2014      EM DASH                                 —
U+2015      HORIZONTAL BAR                          ―
U+2E17      DOUBLE OBLIQUE HYPHEN                   ⸗
U+2E1A      HYPHEN WITH DIAERESIS                   ⸚
U+2E3A      TWO-EM DASH                             ⸺
U+2E3B      THREE-EM DASH                           ⸻
U+2E40      DOUBLE HYPHEN                           ⹀
U+301C      WAVE DASH                               〜
U+3030      WAVY DASH                               〰
U+30A0      KATAKANA-HIRAGANA DOUBLE HYPHEN         ゠
U+FE31      PRESENTATION FORM FOR VERTICAL EM DASH  ︱
U+FE32      PRESENTATION FORM FOR VERTICAL EN DASH  ︲
U+FE58      SMALL EM DASH                           ﹘
U+FE63      SMALL HYPHEN-MINUS                      ﹣
U+FF0D      FULLWIDTH HYPHEN-MINUS                  -