5

我知道这种问题经常被提出,但我想不通为什么这个 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?)(.*)")) {}

谢谢

4

6 回答 6

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");

请注意,这仅适用于路径不包含空格的情况。如果是这样,那么问题就更难了。

于 2013-08-19T13:03:38.790 回答
3

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

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

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

if (line.length() > 0 && line.charAt(0) == 'M')
于 2013-08-19T13:03:04.300 回答
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
于 2013-08-19T13:03:41.157 回答
0

为什么不这样做

line.startsWith("M");
于 2013-08-19T13:03:33.133 回答
0
   String str = new String("M 72208 70779 kij src/com/knapp/testproject/TestDomainf1.java");

   if(str.startsWith("M") ){
        ------------------------
        ------------------------
   }
于 2013-08-19T13:04:36.837 回答
0

如果您需要路径,您可以拆分(我猜不是\t分隔符)字符串并获取最新字段:

String[] tabS = "M            72208    70779 kij          src\com\knapp\testproject\TestDomainf1.java".split("\t");
String path = tabS[tabS.length-1];
于 2013-08-19T13:55:38.283 回答