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?)(.*)")) {} 

谢谢

你不需要正则表达式。 只需使用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); 

OUTPUT:

 src\com\company\testproject\TestDomainf1.java 

正确的正则表达式就是这么简单

 line.matches("M.*") 

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

 line.startsWith("M") 

要么

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

甚至只是

 line.indexOf('M') == 0 

将满足您的要求。

性能?

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

UPDATE

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

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

请注意,这仅在路径不包含空格时才有效。 如果是这样,那么问题就更难了。

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

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

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

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

为什么不这样做

 line.startsWith("M"); 
  String str = new String("M 72208 70779 kij src/com/knapp/testproject/TestDomainf1.java"); if(str.startsWith("M") ){ ------------------------ ------------------------ } 

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

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