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];