【问题标题】:Why is my Back Reference in my Regular Expression Not Working?为什么我的正则表达式中的反向引用不起作用?
【发布时间】:2012-03-27 20:50:29
【问题描述】:

我写了一个正则表达式,试图匹配一些 html 代码,但我不能完全正常工作。我在“wp-caption”之后的部分有问题。

class=(["\'])(?:[\w\s])*?wp-caption[\s\1]

我要匹配的代码:

class="wp-caption"
class='wp-caption'
class="wp-caption foo"
class="foo wp-caption"

我匹配前三个结果,但不匹配第四个。我不认为 \1 正在工作。有什么想法吗?

BTdubs 我一直在使用http://regexpal.com/ 进行测试。

【问题讨论】:

  • 我以前从未见过“BTdubs”。真是令人愉快。
  • 你是对的,反向引用在括号内不起作用。

标签: regex backreference


【解决方案1】:
class=(["\'])(?:[\w\s])*wp-caption[\w\s]*\1

【讨论】:

    【解决方案2】:

    这可能也有效

    class\s*=\s*(['"])(?:(?!\1).)*wp-caption(?:(?!\1).)*\1
    

    【讨论】:

      【解决方案3】:

      它不起作用,因为不能从字符类中引用反向引用(方括号内的东西 [])。正如另一个答案中提到的,您可以在前瞻中使用反向引用,除非您使用的语言不支持环视...

      简而言之,您需要做什么取决于您使用的语言(正则表达式的实现很大程度上取决于实现它们的语言)

      【讨论】:

      • 我什至没有听说过前瞻。那么,为什么反向引用对前三个示例有效?
      • @BFTrick 老实说,我不确定为什么它会与前两个一起使用 - 我相当精通几种正则表达式(包括我假设你正在使用的 JavaScript),我看不到您的表达式如何与前两行匹配,但我将您的示例表达式和代码剪切并粘贴到 regexpal.com 中以确保它只匹配您示例中的第三行...
      • @BFTrick [\s\1] 本质上意味着“匹配空白字符(空格、制表符、CrLf 等)、反斜杠、文字数字 1” - 如果您尝试识别 包含 wp-caption 的任何类属性,那么我假设您删除了一些其他类 following wp-caption 并且匹配成功,因为他们点击了这些类之间的空白 - 他们不应该使用您的表达式匹配示例代码中的前两行。 -->More info on 'lookaround'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      相关资源
      最近更新 更多