我有一个这样的目录,我试图从“photon.exe”之前提取“光子”这个词。
C:\ workspace \ photon \ output \ i686 \ diagnostic \ photon.exe(Suspended)Thread(Running)
我的代码如下所示:
String path = "C:\workspace\photon\output\i686\diagnostic\photon.exe(Suspended) Thread(Running)";
Pattern pattern = Pattern.compile(".+\\\\(.+).exe");
Matcher matcher = pattern.matcher(path);
System.out.println(matcher.group(1));
无论我尝试什么样的排列,我都会继续获取IllegalStateExceptions等,尽管这个正则表达式在http://www.regexplanet.com/simple/index.html上运行。
提前感谢您的帮助。我在这一点上非常沮丧>。<
答案 0 :(得分:7)
您需要实际运行匹配器:
if ( matcher.find() ) {
System.out.println(matcher.group(1));
}
请注意,我使用上面的matcher.find()
代替matcher.matches()
,因为您的正则表达式未设置为与整个字符串匹配(它与(Suspended...
部分不匹配)。既然如此,你真的不需要斜线的序言; \\\\(.+).exe
应该可以正常工作。
当然,the documentation for group(int)
中提到了这一点:
投掷:
IllegalStateException
- 如果尚未尝试匹配,或者上一次匹配操作失败
答案 1 :(得分:2)
您可以使用以下正则表达式:^.*\\(.*)\.exe.*$
,文件名将位于第一个匹配组中。这是一个example。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main
{
public static void main(final String[] args)
{
final String input = args[0];
final Pattern pattern = Pattern.compile("^.*\\\\(.*)\\.exe.*$");
final Matcher matcher = pattern.matcher(input);
if (matcher.find())
{
System.out.println("matcher.group(1) = " + matcher.group(1));
}
else
{
System.out.format("%s does not match %s\n", input, pattern.pattern());
}
}
}
以C:\workspace\photon\output\i686\diagnostic\photon.exe(Suspended) Thread(Running)
作为输入运行它,这是预期的输出:
matcher.group(1) = photon
答案 2 :(得分:0)
(new java.io.File("C:\workspace\photon\output\i686\diagnostic\photon.exe(Suspended) Thread(Running)")).getName().split("\\.")[0];
答案 3 :(得分:0)
试试这个正则表达式:[\\d\\w]+\\.exe
它假定可执行文件只有数字和字母。
另一种方法是使用.+\\.exe
获取完整的文件名,并使用substring
和lastIndexOf('\')
获取文件名。
您也可以使用new File(fullFilePath).getFileName()
这是更正确的方法,因为它可以为您节省substring
- 但我不知道它是否有更好的效果。