如何使这个正则表达式在Java中工作以从Linux' ls -lrt'中获取文件名。输出?

时间:2016-06-03 14:52:27

标签: java regex

我试图在Java中这样做:

    String patternStr = "\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+(.*)";
    Pattern pattern = Pattern.compile(patternStr);

示例' ls -lrt'输出:

drwxrwxr-x    2 bhannan  bhannan      4096 Jun  2 11:27 HelloWorld.xml

但它没有从第一组中获取文件名。但是,这个相同的正则表达式适用于regex101.com:

https://regex101.com/r/mR4rH1/2

我在Java中做错了什么?

实际上,如果我能让这项工作变得更好:

https://regex101.com/r/mR4rH1/1

5 个答案:

答案 0 :(得分:1)

我建议在Java中这样做:

str = str.replaceFirst("^.*\\d{2}:\\d{2}\\s+", "");

其中str代表ls -la输出的每一行。

RegEx Demo

答案 1 :(得分:1)

提示......不要这样做。不要写出这样一个非常丑陋的正则表达式,它与人类能够阅读和理解的东西不相似。我非常确定:下次在IDE中打开此文件以对正则表达式进行细微更改时,您会发现自己花费了相当多的时间来使其正常工作。

含义:为什么这样?为什么要做“ls -a”;然后让你的正则表达式忽略大部分输出?指示ls准确打印您正在寻找的那个信息是不是更有意义?

答案 2 :(得分:0)

这应该适合你:

public static void main(String[] args) {
    String s = "drwxrwxr-x    2 bhannan  bhannan      4096 Jun  2 11:27 HelloWorld.xml";
    System.out.println(s.replaceAll(".*\\s+(\\S+)","$1"));
}

O / P:

HelloWorld.xml

答案 3 :(得分:0)

顺便说一句,最初的正则表达式对我有用。你确定你正确使用Pattern / Matcher吗?

Pattern p = Pattern.compile("\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+(.*)");
Matcher m = p.matcher("drwxrwxr-x    2 bhannan  bhannan      4096 Jun  2 11:27 HelloWorld.xml");
if (m.find()) {
    String filename = m.group(1);   // HelloWorld.xml
}

答案 4 :(得分:0)

我建议改为使用拆分:

public static void main( String args[] ) {
    String str = "drwxrwxr-x    2 bhannan  bhannan      4096 Jun  2 11:27 HelloWorld.xml";

    List list = Arrays.asList( str.split( "\\s+" ) );
    System.out.println( list.get( list.size() - 1 ) );
}

输出:

HelloWorld.xml