我已经将我的案例简化为最简单的示例,但我仍然无法在Java和Python中使用它。这是我的Java代码:
public static void main(String[] args) {
String searchPattern = "gov.noaa.mgdc.mgg.dem:393";
String regExToApply = ":(.+)$";
Pattern pattern = Pattern.compile(regExToApply);
Matcher matcher = pattern.matcher(searchPattern);
while (matcher.find()) {
System.out.println("Match is: \"" + matcher.group() + "\"");
//Output: Match is: ":393"
}
}
在Python中,regEx“:(。+)$”只匹配393,这就是我想要的,但在Java中,它匹配:393。我试过特别列出:作为一个非捕获组,“(?::)(。+)$”,我得到相同的结果。我也注意到删除了括号,“:。+ $”似乎没什么区别。
如何在Java中捕获上面字符串中的393?我还需要一个单独的字符串来捕获冒号之前的所有内容,也不包括冒号。谢谢!
答案 0 :(得分:4)
只使用正则表达式中定义的捕获组而不是matcher.group()
返回的整个匹配表达式
System.out.println("Match is: \"" + matcher.group(1) + "\"");
^
captured group 1 -----------------|
答案 1 :(得分:2)
在没有任何参数的情况下调用matcher.group()
与调用matcher.group(0)
相同,根据API文档,它会返回整个模式的匹配项。
请参阅API文档:https://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#group(int)
要使用一组括号匹配组,您必须指定一个大于0的数字。您要查找的是第1组。
System.out.println("Match is: \"" + matcher.group(1) + "\"");
答案 2 :(得分:0)
在Python中,您使用的是findall()
,不是吗?这种方法有点奇怪。如果正则表达式中没有捕获组,则它仅列出完整匹配,但如果 捕获组,则仅列出组。完整的匹配仍然存在,它只是没有显示给你。
如果您使用search()
方法获取match
对象,那么您会发现自己拥有与Java相同的选项:group()
或group(0)
检索整个匹配(:393
)或group(1)
以获取您感兴趣的部分(393
)。
每种语言对正则表达式采取不同的方法,它们都会做出一些令人惊讶的选择。例如,在Java中,matches()
是一个动词,意思是“此正则表达式描述整个字符串”,但在.NET中,Matches()
是一个名词,意思是“这个正则表达式可能有一个或多个匹配字符串;这是所有它们的列表“。不要把任何事情视为理所当然。