我正在使用Java,当输入为PRP I
时,我希望实现输出为(NP (PRP I))
的代码。
我目前的实现如下:
Pattern pattern = Pattern.compile("\\((.?)\\)");
Matcher matcher = pattern.matcher(noun_phrase);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
,其输出为NP (PRP I
。
我知道有一种可能性是计算括号,但我想知道是否有任何方法可以使用regex
来获取嵌套括号内的字符串。
答案 0 :(得分:0)
这应该有效
Pattern pattern = Pattern.compile("\\(.*?\\((.*?)\\)\\)");
Matcher matcher = pattern.matcher("(NP (PRP I))");
while (matcher.find()) {
System.out.println(matcher.group(1));
}
您可以使用以下网站来试验正则表达式。
https://regex101.com/r/cE0dM7/1
答案 1 :(得分:0)
您需要在群组周围添加其他大括号。此外,您需要确保固定括号之间不匹配括号:
String noun_phrase = "(NP (PRP I))";
Pattern pattern = Pattern.compile("\\([^(]*\\(([^)]*)\\)[^)]*\\)");
Matcher matcher = pattern.matcher(noun_phrase);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
否定的字符类[^(]
和[^)]
确保您不要过于热心地匹配括号。
答案 2 :(得分:0)
好吧,因为我不知道你可以用你的parantheses多深,我会建议两种可能的解决方案。
解决方案1:假设深度与问题完全一致。
此正则表达式将起作用:Pattern pattern = Pattern.compile("\\(([^()]*)\\)")
。
解决方案2:假设深度是任意的(但至少最内层的字符串被parantheses包围)。
在这种情况下,您将不得不进行一些更改。首先,您的模式将如下所示:Pattern pattern = Pattern.compile("(\\(.*)*\\(([^)]*)\\)")
。看到不同?你现在有两个组,第一个匹配除了最内层的部分被parantheses包围,第二个组正是你想要的那个。这意味着,在您的循环中,您必须将matcher.group(1)
更改为matcher.group(2)
。此外,[^)]
确保您的小组中没有任何结束语。