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

问题描述 投票:1回答:1

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

  1. 这是不应单独捕获数字500-600的示例。
  2. 这是另一个不应单独捕获数字500到600的示例。
  3. 这是一个应该捕获600的示例。

因此,在示例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))
ruby-on-rails regex
1个回答
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+ - 1位或更多位数
  • \s* - 零个或多个空格
  • (?:-|to) - -to字符序列
  • \s*\d+ - 0+空格,然后是1+位数

独立号码替代分支:

  • \d+ - 1位或更多位数。

注意(基于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                  -
© www.soinside.com 2019 - 2024. All rights reserved.