0

我有一个使用环视来确保捕获的字符串位于其他两个字符串之间的模式

所以换句话说,对于主题字符串

xxxcabyyy

我的正则表达式看起来像

String myregex = ((?<=xxx)cab(?=[y]+))

所以我想多次使用这个正则表达式,因为我可能正在寻找其他类似的东西

(test string) xxxcabyyy

我想要一个像这样的正则表达式

"\(test string\)(?=" + myregex + ")"

说在我的正则表达式匹配之前找到“(测试字符串)”。

这似乎并不完全正确,我认为这是因为我在我的正则表达式中有环顾四周,我现在正嵌入到前瞻中......我能做些什么来纠正这种情况?

4

3 回答 3

1

可以将环视放在其他环视中,但我不明白你为什么需要这样做。事实上,我认为没有必要进行环视期。这行不通吗?

"\\(test string\\)\s*xxx(cab)y+"

假设它是cab您感兴趣的部分,您可以通过Matcher#group(1).

于 2012-02-02T03:42:45.790 回答
0

If you want a solution with the lookarounds in other lookarounds, you can do

\(test string\)(?=.*?((?<=xxx)cab(?=[y]+)))

or if it's (test string) followed by the xxxcabyyy and just spaces in between that you're after:

\(test string\)(?= *((?<=xxx)cab(?=[y]+)))

This is because at the point at which you match (test string), there are still characters to go before you hit the xxxcabyyy, and you'll have to include them in your lookahead.

于 2012-02-02T05:23:28.423 回答
0

您的猜测是正确的 - 这不起作用,因为您已经在 string 中指定了lookbehind 和lookahead 结构myregex。解决这个问题的一种方法是为你想要的后向和前瞻结构保存单独的字符串,并在你需要进行匹配之前使用它们来构建最终的正则表达式字符串。例如,您可以编写如下方法,该方法将返回一个正则表达式字符串,给定lookbehind和lookahead结构以及它们之间的匹配内容:

public static String lookaroundRegex(String behind, String match, String ahead) {
    return "((?<=" + behind + ")" + match + "(?=" + ahead + "))";
}

然后,您可以按如下方式使用它:

String behind = "xxx";
String ahead = "[y]+";
String match = "cab";

// For the first case:
Pattern regexPattern1 = Pattern.compile(lookaroundRegex(behind, match, ahead));

// For the second case:
String behind2 = "\\(test string\\) " + behind;
Pattern regexPattern2 = Pattern.compile(lookaroundRegex(behind2, match, ahead));
于 2012-02-01T23:00:12.263 回答