正则表达式字符串匹配括号内的字符串

Regular expression string matching with string inside parenthesis

我一直面临正则表达式字符串匹配问题。这是我的字符串 - var String detectionString = Stack Overflow (hello)

我尝试了这个正则表达式测试 - \s(detectionString)\b 但只能成功匹配字符串 Stack Overflow。任何人都可以帮助提供一个正则表达式字符串,该字符串也可以匹配并包含括号内的单词。

在这里,我尝试匹配我的字符串并成功,但它需要在字符串之间使用正则表达式(方括号覆盖括号可以解决这个问题),如 (Stack Overflow [ ( ] 你好 [ ) ]) 。我的问题是我无法在字符串之间添加表达式。

注意:可以是任何类型的带有括号的字符串,例如 - var String detectionString = Krunal Bhavsar 123 (iOS)

类似于:

(Stack Overflow)\s(\(hello\))

我建议将整个目标字符串括在 \Q\E 之间:

Pattern p = Pattern.compile("\b\QStack Overflow (hello)\E\b");

如果您尝试动态构建模式,那么这也非常有效,以便可以匹配其他目标字符串。在这种情况下唯一需要注意的是,您需要注意目标字符串包含双字符子字符串 \E 的情况。如果是,那你就逃脱了。

例如,您可以在 \E 之间插入 \E\Q。也就是说,要匹配字符串 This string has literal \E inside,您可以使用

Pattern p = Pattern.compile(
        "\b\QThis string has literal \\E\QE inside\E\b");

另请注意 String 文字 的转义语法与正则表达式引擎解释的转义序列之间的区别。这些是单独的图层。

更新:

此外,我或多或少地遵循了您关于匹配边界的原始模式尝试——也就是说,通过在前导和尾随 \b 来匹配单词边界。然而,事实证明,输入的结尾并不构成 Java 目的的单词边界(尽管 beginning 确实如此)。因此,在一个或两个地方使用零宽度断言可能更适合您的目的。例如:

Pattern p = Pattern.compile("(?<!\w)\QStack Overflow (hello)\E(?!\w)");

当然,您可能需要根据自己的具体需要调整细节,但这 确实 在我的测试中有效。