Ruby on rails 正则表达式捕获一个数字,如果后面没有连字符或单词;至;

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”,如果不包含“-”,则需要单独

我想使用正则表达式来捕获文本中的单个数字,只要它不后跟“-”或“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备选方案的工作方式。看

    详细信息

    范围替代分支:

    • \d+
      -1个或多个数字
    • \s*
      -零个或多个空格
    • (?:-| to)
      -a
      -
      to
      字符序列
    • \s*\d+
      -0+空格,然后是1+位数
    独立编号替代分支:

    • \d+
      -1个或多个数字
    注意(基于):

    您可能希望使用匹配的
    \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}