【问题标题】:Regex Negative Lookahead issue正则表达式负前瞻问题
【发布时间】:2014-05-24 01:58:07
【问题描述】:

我认为这被称为负前瞻(正则表达式的新功能),无论如何都没有得到我想要的结果。我正在尝试使用它来取消整个组的资格或使其合格

(?(?!The|Cross)(\w+ )Street)

所以我想捕获 STREET 组,它是 Main Street 或 Bank Street,而不是 The Street 或 Cross Street。

字符串“The Street”得到的是

  • 街道:'他街'

对于“Cross Street”我也得到了

  • 街道:“罗斯街”

我正在寻找的是不匹配,即“您的模式与子字符串不匹配”

有没有办法以这种方式使用负前瞻?换句话说,AnyWord Street 匹配我的模式,The Street 和 Cross Street 不匹配并且返回零匹配并且标签没有值。

【问题讨论】:

    标签: regex negative-lookahead


    【解决方案1】:

    使用单词边界 (\b) 会给你想要的。

    Javascript 示例:

    /(?!The|Cross)(\b\w+ )Street/.test('Main Street')
    // => true
    /(?!The|Cross)(\b\w+ )Street/.test('Bank Street')
    // => true
    /(?!The|Cross)(\b\w+ )Street/.test('The Street')
    // => false
    /(?!The|Cross)(\b\w+ )Street/.test('Cross Street')
    // => false
    

    【讨论】:

      【解决方案2】:

      您的要求不明确。 您写过“我想在大街或银行街而不是大街或十字街时捕获 STREET 组”。

      这个条件可以简化为任一

      1. “我想捕获位于 Main Street 或 Bank Street 的 STREET 组”或
      2. “我想捕获不是 The Street 或 Cross Street 的 STREET 组”。

      这些变体与另一个不同。

      但是您的代码示例倾向于第二种选择。 这就是为什么下面的答案是第二个选择。

      示例对应 Perl 语法:

       /(?<!The|oss)\s+Street/
      

      说明:在 Perl 中,lookbehind (?

      正则表达式从“Cross”弱化为“oss”可以避免如下:

       /(?<!The)(?<!Cross)\s+Street/
      

      【讨论】:

      • 也许我的解释不清楚,因为条件是 1. 你指出的地方是 2. 当它是 The Street 或 Cross Street 时,我不想捕获 Street。实际上,要求只是“我想在街道是 AnyWord 街道时捕获街道,除非 AnyWord 是 Cross 或 The。解决方案 (?!The|Cross)(\b\w+ )Street 运行良好。
      猜你喜欢
      • 2018-04-03
      • 1970-01-01
      • 2021-10-11
      • 2011-10-14
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多