我对RegEx很陌生。我没有多少经验。我已经在互联网上搜索并在regex101.com上尝试了很多东西。似乎没什么用。
这是模式:
\\((.*?)\\)
我将它与 Java 的 replaceAll 结合使用,为字符串中提供的每个?:
添加(...)
(用户输入)。
用户输入也用作正则表达式。但目前我将其视为正常的字符串。
想象一下这个用户输入:(Welcome, (StackOverflow|World)|Hello, Dad)
我想要的结果是:(?:Welcome, (?:StackOverflow|World)|Hello, Dad)
但我只收到第一个?:
:(?:Welcome, (StackOverflow|World)|Hello, Dad)
我想,我理解这个问题。 我想, RegEx从右向左扫描并尝试获得最小的匹配(请参阅.*?
)。它会搜索(
直到下一个)
。这是(Welcome, (StackOverflow|World)
。
我该怎么做才能首先匹配这些嵌套匹配?我不能让用户修改他们的输入。我必须找到一个更好的正则表达式模式,以匹配从最小可能匹配到最大可能匹配,而不是从左到右。
答案 0 :(得分:1)
我建议搜索未跟随(
的任何未转义的?:
(以便不在文字(
之后添加?
)(以避免匹配的外观/非 - 捕获组/等,):
(?<!\\)((?:\\{2})*)\((?!\?)
并替换为$1(?:
。请参阅regex demo。
Java声明:
String pat = "(?<!\\\\)((?:\\\\{2})*)\\((?!\\?)";
<强>详情:
(?<!\\)
- 当前位置左侧没有反斜杠((?:\\{2})*)
- 第1组:零个或多个偶数个反斜杠\(
- 文字(
... (?!\?)
- 文字?
没有立即跟随。