2013-03-25 67 views
2

我使用的正则表达式在RegexBuddy中工作,但在Java中不起作用。正则表达式在Java中没有像预期的那样工作

这是我的正则表达式:(?<=(files)\\s)(.*)

这是我在测试它的字符串:"–files /root1/file1.dat;/root/file2.txt"

在使用RegexBuddy它的返回:"/root1/file1.dat;/root/file2.txt"但在Java它返回只是字面字files

为什么不能正常工作?

+2

当你说“它回来了......”你究竟是什么意思?你的原始正则表达式应该有'matcher.group()'和'matcher.group(2)'包含'/ root1/.....',但是'matcher.group(1)'将包含字符串'files',因为捕获括号内的括号。 – 2013-03-25 23:18:55

+0

@IanRoberts我使用组(1)犯了错误。我得到解释后,我已经修复了代码,现在应该是。 – user2205591 2013-03-25 23:43:51

回答

3

试试这个正则表达式:

(?<=files\\s)(.*) 

编辑附加解释

我猜你服用group(1)

您正则表达式:(?<=(files)\\s)(.*)有三个比赛组:

group 0:/root1/file1.dat;/root/file2.txt 
group 1:files 
group 2:/root1/file1.dat;/root/file2.txt 

矿:(?<=files\\s)(.*)有两个:

group 0:/root1/file1.dat;/root/file2.txt 
group 1:/root1/file1.dat;/root/file2.txt 

在向后看组其实是没有必要的,而且你(.*)成为group(2)如果你想获得'/root1.....$”,你不必须分组,

(?<=files\\s).* 

会做这项工作。

无论如何,如果你要坚持你的正则表达式,采取group(2)

我希望这是明确的解释。

+0

谢谢。在这种情况下,是否有关于括号的规则很好知道? – user2205591 2013-03-25 23:08:23

+0

好的我正在编辑答案 – Kent 2013-03-25 23:11:23

+0

@HugoDozois请参阅编辑。 – Kent 2013-03-25 23:20:54

0

奇怪的是,我运行这个,我看到没有区别,如果我把括号放在文件或没有。外观内的支架没有区别。

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class regex 
{ 
    public static void main(String[] args) 
    { 

     String s = "-files /root1/file1.dat;/root/file2.txt"; 
     Pattern p = Pattern.compile("(?<=-(files)\\s)(.*)"); 
     Matcher m = p.matcher(s); 
     System.out.println(m.find()); 
     System.out.println(m.group()); 
    } 
} 

请注意,如果你正在试图解析命令行参数,这样便很可能是因为你会遇到的问题(可能)与此重叠的其他参数是一个坏主意。那么像“-docs freds-files -files blah.txt”这样的情况呢?

+0

问题是我使用组(1)。我知道正则表达式并不完美,但我正在做的项目没有关系。我只需要将代码放入该正则表达式中,以便在最后一个空格之后停止返回 – user2205591 2013-03-25 23:49:17

相关问题