正则表达式在Java中没有按预期工作

时间:2013-03-25 23:02:53

标签: java regex

我使用的是在RegexBuddy中运行但在Java中不起作用的正则表达式。

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

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

在RegexBuddy中它返回:"/root1/file1.dat;/root/file2.txt"但在Java中它只返回文字files

为什么这不起作用?

2 个答案:

答案 0 :(得分: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
实际上没有必要使用后视组,如果你想得到`/root1..... $',你的(.*)变为group(2),你不需要组,

(?<=files\\s).*

将完成这项工作。

无论如何,如果你想坚持你的正则表达式,请group(2)

我希望很清楚解释。

答案 1 :(得分: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”这样的情况呢?