Ruby on rails 正则表达式捕获一个数字,如果后面没有连字符或单词;至;
我想使用正则表达式来捕获文本中的单个数字,只要它不后跟“-”或“to”。例如:Ruby on rails 正则表达式捕获一个数字,如果后面没有连字符或单词;至;,ruby-on-rails,regex,Ruby On Rails,Regex,我想使用正则表达式来捕获文本中的单个数字,只要它不后跟“-”或“to”。例如: 这是一个不应单独捕获数字500-600的示例 这是另一个不应单独捕获数字500到600的示例 这是一个应捕获600的示例 因此,在示例1和2中,不应单独捕获数字500和600,因为-和to包含在数字500-600之间,但整个字符串应捕获为“500-600”。 在示例3中,应捕获数字600。我的问题是,示例1和2中的数字是单独捕获的,而当包含“-”时,我需要捕获整个字符串“500-600”,如果不包含“-”,则需要单独
((?:[\p{P}-[-.,\]]\s*|to\s*)\d+\.?\d*(?:\s*[\p{P}-[-.,\]]\s*|\s*to))
使用替代组,将更具体的
number-number
或number-to-number
模式作为第一个替代分支,并仅匹配第二个分支中的独立编号:
s.scan(/\d+ *(?:-|to) *\d+|\d+/)
或-匹配任何空格
s.scan(/\d+\s*(?:-|to)\s*\d+|\d+/)
看
请注意,一旦第一个备选方案匹配,就不会尝试第二个备选方案,因为这是NFA regex备选方案的工作方式。看
详细信息:
范围替代分支:
-1个或多个数字\d+
-零个或多个空格\s*
-a(?:-| to)
或-
字符序列to
-0+空格,然后是1+位数\s*\d+
-1个或多个数字\d+
\p{Pd}
,而不是-
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 -
你把例子留白了。你能更具体一点吗:你用这个正则表达式做什么?我想说的是,你可能在使用一种简单的技术——匹配并捕获你想要的,然后匹配你不想要的——@WiktorStribiżew我添加了更多的解释,因为我的问题不清楚。我想捕获-| to,但如果后面没有-| to,也可以单独捕获数字。这是否意味着它更简单。你为什么使用
\p{p}
?@WiktorStribiżew谢谢你。看起来效果不错。这样它就不会分别捕获500,600个,如果-,到介于两者之间,对吗?它将只捕获500-600个字符。您可能希望使用“\p{Pd}”而不是“-”,以便捕获em和en破折号以及连字符。我不知道数据是从哪里来的,但如果是用户输入,那么总有人会从一个单词中复制出来document@DaveMongoose:听起来很有帮助,我添加了一个注释,其中描述了与答案匹配的\p{Pd}
。