Java Regex不匹配

时间:2013-08-19 13:00:22

标签: java regex

我知道经常提出这类问题,但是 我无法弄清楚为什么这个RegEx不匹配。 我想检查一行的开头是否有“M”。 最后,我希望路线尽头的路径。 这就是startsWith()不适合我的需要的原因。

line = "M            72208    70779 koj          src\com\company\testproject\TestDomainf1.java";

if (line.matches("^(M?)(.*)$")) {}

我也尝试过另一种方法:

Pattern p = Pattern.compile("(M?)");
Matcher m = datePatt.matcher(line);
if (m.matches()) {
    System.out.println("yay!");
}

if (line.matches("(M?)(.*)")) {}

由于

6 个答案:

答案 0 :(得分:5)

正确的正则表达式只是

line.matches("M.*")

因为matches方法强制整个输入序列必须匹配。但是,这是一个很简单的问题,我想知道你是否真的需要一个正则表达式。一个普通的

line.startsWith("M")

line.length() > 0 && line.charAt(0) == 'M'

甚至只是

line.indexOf('M') == 0 

将符合您的要求。

性能?

如果你对性能感兴趣,我的第二个和第三个选项在该部门中获胜,而第一个选项可能很容易成为最慢的选项:它必须首先编译正则表达式,然后进行评估。 indexOf有一个问题,即最糟糕的情况是扫描整个字符串。

更新

与此同时,您已经完全重述了您的问题并明确表示正则表达式是您真正需要的。在这种情况下,以下应该有效:

Matcher m = Pattern.compile("M.*?(\\S+)").matcher(input);
System.out.println(m.matches()? m.group(1) : "no match");

注意,这仅在路径不包含空格时有效。如果确实如此,那么问题就更难了。

答案 1 :(得分:3)

您可以使用此模式检查M字符是否显示在字符串的开头:

if (line.matches("M.*"))

但是对于这么简单的事情,你可以使用它:

if (line.length() > 0 && line.charAt(0) == 'M')

答案 2 :(得分:3)

你不需要正则表达式。只需使用String#startsWith(String)

即可
if (line.startsWith("M")) {
    // code here
}

或者使用String#toCharArray()

if (line.length() > 0 && line.toCharArray()[0] == 'M') {
    // code here
}

编辑:在您编辑了从输入字符串获取路径的要求之后。

你仍然可以避免使用正则表达式并使用这样的代码:

String path="";
if (line.startsWith("M"))
    path = line.substring(line.lastIndexOf(' ')+1);
System.out.println(path);

<强>输出:

src\com\company\testproject\TestDomainf1.java

答案 3 :(得分:0)

为什么不这样做

line.startsWith("M");

答案 4 :(得分:0)

   String str = new String("M 72208 70779 kij src/com/knapp/testproject/TestDomainf1.java");

   if(str.startsWith("M") ){
        ------------------------
        ------------------------
   }

答案 5 :(得分:0)

如果你需要Path,你可以拆分(我猜比\t是分隔符)字符串并取最新字段:

String[] tabS = "M            72208    70779 kij          src\com\knapp\testproject\TestDomainf1.java".split("\t");
String path = tabS[tabS.length-1];