【发布时间】:2020-02-02 11:12:26
【问题描述】:
我有一个不寻常的应用程序,我需要提取正则表达式模式的后向和前向部分的内容(当然是使用正则表达式!)。例如在以下模式中:
(?<=(?:c|d))123(?=(?:x|y))
匹配以下字符串中的第一个123:
abc123xyz123xyz
我需要的是提取以下字符串:
(?:c|d)
和
(?:x|y)
这很困难,因为我无法轻易找到正确的右括号,因为可能有其他括号,如示例中所示。
只是想知道以前是否有人必须这样做。欢迎任何想法
【问题讨论】:
-
如果您可以在环视中访问捕获组的值,您可以将非捕获组转换为捕获组并使用字符类来匹配单个字符而不是替代
(?<=([cd]))123(?=([xy]))@987654321 @ -
想象一个像
(?<=\([abc]\)(?![aeiou])[a-z]\(\))blah(?=[xyz](?:(abc|def)ghi))这样的正则表达式,我认为你应该编写一个解析器。 -
对于 PCRE,
(?s)(?<!\\)(?:\\{2})*\K\(\?:(?:[^\\()]|\\.|(\((?:[^()]++|(?1))*\)))*\)之类的内容会有所帮助。见demo。在 .NET 中,将(?<!\\)(?:\\{2})*\K替换为(?<=(?<!\\)(?:\\{2})*) -
第四鸟。谢谢。我可以这样做,但不幸的是,我仍然无法找到正确匹配的右括号。
-
@Kaveh1000,我试图为这个令你困惑的正则表达式提供答案。和我。我不知道
++是什么,但现在我清楚了一点,也许它也可以让你更清楚。