【问题标题】:Regex: a number vs. a backreference to a capture group正则表达式:数字与对捕获组的反向引用
【发布时间】:2019-12-09 17:23:54
【问题描述】:

我一直在研究正则表达式,但我在这个问题上摸不着头脑。在此页面 (https://www.regular-expressions.info/conditional.html) 我看到,在条件正则表达式中,对编号反向引用的引用只是一个数字。例如,

(a)?b(?(1)c|d)

正则表达式如何知道我们不应该匹配数字“1”而不是对第一个捕获组的反向引用?在之前的课程中,我了解到反向引用会被转义,例如 \1、\2 等。

【问题讨论】:

  • 特殊语法?(#)紧跟在(之后
  • 谢谢!如果您将您的回复作为答案发布,我会相应地标记它。
  • 如果有人真的想用这种方式匹配文字 1 怎么办?

标签: regex numbers conditional-statements backreference


【解决方案1】:

根据您所遵循的正则表达式教程:

一个特殊的构造(?ifthen|else) 允许您创建条件正则表达式。如果 if 部分的计算结果为 true,则正则表达式引擎将尝试匹配 then 部分。否则,将尝试 else 部分。 语法由一对括号组成。 左括号后面必须跟一个问号,紧跟 if 部分,紧跟 then 部分。这部分后面可以跟一个竖线和其他部分。你可以省略 else 部分和竖线。

或者,您可以在 if 部分检查到目前为止是否有一个捕获组参加了比赛。 将捕获组的编号放在括号内,并将其用作 if 部分。

你的第二个问题是这样的:

RegEx Demo of \b(a)?b(?(1)c|d)\b

请注意,我添加了单词边界以避免部分匹配 abd 之类的字符串。

如果有人真的想以这种方式匹配文字 1 怎么办?

有效输入:1cd 无效输入:1d

那就是:

\b(1)?(?(1)c|d)\b

【讨论】:

  • 如果要测试字符串中是否存在文字 1 怎么办?
  • 你能告诉我一个有效和无效的输入示例吗?
  • 有效输入 = 1cd 无效输入 = 1d 所以,这行不通?... (?(1)c|d)
  • 看起来我需要做这样的事情(1)?(?(1)c|d)
  • 确实是\b(1)?(?(1)c|d)\b
猜你喜欢
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 2012-11-06
相关资源
最近更新 更多