如何使这个正则表达式在Java中工作,从而从Linux';ls-轻轨';输出?

如何使这个正则表达式在Java中工作,从而从Linux';ls-轻轨';输出?,java,regex,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); str = str.replaceFirst("^.*\\d{2}:\\d{2}\\s+", ""); “ls-lrt”输出示例: drwxrwxr-x 2 bha

我正试图用Java实现这一点:

    String patternStr = "\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+(.*)";
    Pattern pattern = Pattern.compile(patternStr);
str = str.replaceFirst("^.*\\d{2}:\\d{2}\\s+", "");
“ls-lrt”输出示例:

drwxrwxr-x    2 bhannan  bhannan      4096 Jun  2 11:27 HelloWorld.xml
但它没有从第一组中获取文件名。但是,同样的正则表达式在regex101.com上工作:

我在Java中做错了什么

事实上,如果我能让它工作,那会更好:


这应该适合您:

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:


我建议使用Java执行此操作:

    String patternStr = "\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+\\S+\\s+(.*)";
    Pattern pattern = Pattern.compile(patternStr);
str = str.replaceFirst("^.*\\d{2}:\\d{2}\\s+", "");
其中
str
表示
ls-la
输出的每一行


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


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

顺便说一句,初始regexp对我有用。您确定正确使用图案/匹配器吗

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
}

我建议改为使用拆分:

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

您正在尝试用java获取文件信息吗?有比执行externa
ls
并解析输出更好的方法…我认为它可以工作,但不会深入到这一步。。。我别无选择。我使用的是JSch库,它使用ls(),它通过SSH执行底层ls命令。如果服务器在ls上有一个类似ls-a的别名,我会得到错误的输出。我正在为JSch库做一个bug处理。。。不幸的是,我必须这么做。可怜的你。正如您刚才解释的,您遇到了一个巨大的问题:如果您的应用程序正在与不同的服务器通信,那么可能会有不同的配置-您如何确保返回的ls输出将与您的正则表达式匹配?目前还不能保证,但如果他们设置了别名,则不会返回有效的文件名。我现在有更大的机会能够使用这种黑客手段获取文件。使用
com.jcraft.jsch.ChannelSftp
扫描和枚举文件会更简单吗?我是!这就是我遇到的问题,因为它调用ls,但服务器上的别名将其映射到ls-lrt,因此它返回文件名和longFilename,类似于“drwxrwxr-x 2 bhannan bhannan 4096 Jun 2 11:27 HelloWorld.xml”,而不仅仅是HelloWorld.xml。这正是我需要的。谢谢我做的是第(1)组,而不是第(0)组。我不知道这对你有什么作用,因为我不知道。