我试图在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中做错了什么?
实际上,如果我能让这项工作变得更好:
答案 0 :(得分:1)
答案 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