【问题标题】:Regex backreference why not working [duplicate]正则表达式反向引用为什么不起作用[重复]
【发布时间】:2018-03-24 02:41:23
【问题描述】:

我有正则表达式((\w;)+\w\n)(-{3,}\n)((\w;)+\w\n)+,它应该匹配以下文本:

H;e;l;a;a
---------
J;a;c;k;p

as can be seen here.

我注意到在我的正则表达式中我有 ((\w;)+\w\n) 的重复部分,所以我尝试使用反向引用重构我的正则表达式。

所以我得到了((\w;)+\w\n)(-{3,}\n)\1+,但这个与上面的示例文本不匹配。为什么这个反向引用不起作用?

【问题讨论】:

  • 您使用的是哪种语言或工具?反向引用也用于引用先前匹配的文本,而不是正则表达式本身
  • 在某些正则表达式中,您需要屏蔽 + 号。其他人在完整的行上运行,不会匹配换行符。
  • 我在 Java 中使用正则表达式,但我首先在 regexr.com 中测试正则表达式
  • @Vasan 如何获得反向引用以匹配之前的正则表达式?
  • 或者有没有其他方法可以删除我初始正则表达式中的重复项?

标签: regex regex-negation regex-lookarounds regex-group regex-greedy


【解决方案1】:
((\w;)+\w)\n-{3,}\n((?1)\n)+(?1)

这似乎适用于这种情况以及 PCRE 中的以下文本。

[示例文本]

H;e;l;a;a
---------
J;a;c;k;p
c;d;e;d;c
f;d;e;c;d
k;d;c;d;s
d;e;f;d;e

Demo

如果示例文本以换行符(\n) 结尾,则不需要此正则表达式 (?1) 的最后一部分

【讨论】:

  • 如 cmets 中所述,这是 PCRE 语法,Java 或 Kotlin 不支持(OP 期望的)。
  • 我错过了一些 cmets。抱歉,我已经用这个正则表达式适用于 PCRE 的短语对其进行了编辑:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 2014-06-01
相关资源
最近更新 更多