我想使用正则表达式来捕获文本中的单个数字,只要它不跟随或跟在“ - ”或“to”之后。例如:
因此,在示例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))
答案 0 :(得分:2)
使用替换组并将更具体的number - number
或number 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 -