首页 文章

正则表达式中的匹配条件

提问于
浏览
1

只是提前注意:我是一个正念新手 . 也许对这个问题的一个很好的答案将涉及将我与一个解释这些条件如何工作的资源联系起来:)

让我们说我有一个街道名称,如23rd St或5th St.我想摆脱诉讼“th”,“rd”,“nd”和“st” . 如何才能做到这一点?

现在我的表达式为:(st | nd | rd | th) . 这个问题是它也会匹配包含“st”,“nd”,“rd”或“th”的街道名称 . 所以我真正需要的是一个条件匹配,它在自身之前寻找至少一个数字(即;第一个而不是街道) .

谢谢!

4 回答

  • 1

    听起来你只想匹配序数后缀(st | nd | rd | th),是吗?

    如果您的正则表达式引擎支持它,您可以使用lookbehind assertion .

    /(?<=\d)(st|nd|rd|th)/
    

    仅当前面有数字 \d 时才匹配 (st|nd|rd|th) ,但匹配不会捕获数字本身 .

  • 2

    你真正想要的是锚 .

    全球尝试和替换:

    \b(\d+)(?:st|nd|rd|th)\b
    

    与第一组 .

    说明:

    • \b - >匹配一个位置,其中字符(数字,字母,下划线)后跟非字字符(没有前一个组),或相反;

    • (\d+) - >匹配一个或多个数字,并在第一组($ 1)中捕获它们;

    • (?:st|nd|rd|th) - >匹配任何 st 等...没有捕获它( (?:...) 是非捕获组);

    • \b - >见上文 .

    使用perl进行演示:

    $ perl -pe 's/\b(\d+)(?:st|nd|rd|th)\b/$1/g' <<EOF
    > Mark, 23rd street, New Hampshire
    > I live on the 7th avenue
    > No match here...
    > azoiu32rdzeriuoiu
    > EOF
    Mark, 23 street, New Hampshire
    I live on the 7 avenue
    No match here...
    azoiu32rdzeriuoiu
    
  • 5

    尝试使用此正则表达式:

    (\d+)(?:st|nd|rd|th)
    

    我不知道红宝石 . 在PHP中我会使用类似的东西:

    preg_replace('/(\d+)(?:st|nd|rd|th) /', '$1', 'South 2nd Street');
    

    删除后缀

  • 0

    删除序数:

    /(\d+)(?:st|nd|rd|th)\b/$1/
    

    您必须捕获该号码,以便可以用它替换匹配 . 您可以捕获序数与否,除非您想将其输出到其他地方,否则无关紧要 .

    http://www.regular-expressions.info/javascriptexample.html

相关问题