我知道经常提出这类问题,但是 我无法弄清楚为什么这个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?)(.*)")) {}
由于
答案 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];