首先匹配最小嵌套部分的正则表达式

时间:2017-06-08 10:58:46

标签: java python regex

我对RegEx很陌生。我没有多少经验。我已经在互联网上搜索并在regex101.com上尝试了很多东西。似乎没什么用。

这是模式: \\((.*?)\\)

我将它与 Java replaceAll 结合使用,为字符串中提供的每个?:添加(...)(用户输入)。

用户输入也用作正则表达式。但目前我将其视为正常的字符串。

想象一下这个用户输入:(Welcome, (StackOverflow|World)|Hello, Dad)

我想要的结果是:(?:Welcome, (?:StackOverflow|World)|Hello, Dad)

但我只收到第一个?:(?:Welcome, (StackOverflow|World)|Hello, Dad)

我想,我理解这个问题。 我想, RegEx从右向左扫描并尝试获得最小的匹配(请参阅.*?)。它会搜索(直到下一个)。这是(Welcome, (StackOverflow|World)

我该怎么做才能首先匹配这些嵌套匹配?我不能让用户修改他们的输入。我必须找到一个更好的正则表达式模式,以匹配从最小可能匹配到最大可能匹配,而不是从左到右。

1 个答案:

答案 0 :(得分:1)

我建议搜索未跟随(的任何未转义的?:(以便不在文字(之后添加?)(以避免匹配的外观/非 - 捕获组/等,):

(?<!\\)((?:\\{2})*)\((?!\?)

并替换为$1(?:。请参阅regex demo

Java声明:

String pat = "(?<!\\\\)((?:\\\\{2})*)\\((?!\\?)";

<强>详情:

  • (?<!\\) - 当前位置左侧没有反斜杠
  • ((?:\\{2})*) - 第1组:零个或多个偶数个反斜杠
  • \( - 文字( ...
  • (?!\?) - 文字?没有立即跟随。