如何使用Java解析以下String
以提取文件路径?
?
代表任意数量的随机字符
_
代表任意数量的空格(无新行)
?[LoadFile]_file_=_"foo/bar/baz.xml"?
示例:
10:52:21.212 [LoadFile] file = "foo/bar/baz.xml"
应提取foo/bar/baz.xml
答案 0 :(得分:12)
String regex = ".*\\[LoadFile\\]\\s+file\\s+=\\s+\"([^\"].+)\".*";
Matcher m = Pattern.compile(regex).matcher(inputString);
if (!m.find())
System.out.println("No match found.");
else
String result = m.group(1);
结果中的String
应该是您的文件路径。 (假设我没有犯任何错误)
您应该查看Pattern
类以获取一些正则表达式帮助。它们可以是一个非常强大的字符串操作工具。
答案 1 :(得分:3)
简答:使用 subSequence()。
if (line.contains("[LoadFile]"))
result = line.subSequence(line.indexOf('"'), line.lastIndexOf('"')).toString();
在我的机器上,这一直持续不到10,000 ns。
我正在以“高效”来表示更快。
正则表达式选项相当慢(大约慢9或10倍)。正则表达式选项的主要优点是,另一个程序员可能更容易弄清楚你在做什么(但随后使用注释来帮助他们)。
要使regex选项更有效,请对其进行预编译:
private static final String FILE_REGEX = ".*\\[LoadFile\\]\\s+file\\s+=\\s+\"([^\"].+)\".*";
private static final Pattern FILE_PATTERN = Pattern.compile(FILE_REGEX);
但这仍然让它变慢。我记录的时间在80,000到100,000 ns之间。
StringTokenizer选项比正则表达式更有效:
if (line.contains("[LoadFile]")) {
StringTokenizer tokenizer = new StringTokenizer(line, "\"");
tokenizer.nextToken();
result = tokenizer.nextToken();
}
这对我来说徘徊在40,000 ns左右,比正则表达式快2-3倍。
在这种情况下,split()也是一个选项,对我来说(使用Java 6_13)只比Tokenizer快一点:
if (line.contains("[LoadFile]")) {
String[] values = line.split("\"");
result = values[1];
}
这对我来说平均为35,000 ns。
当然,这都不是检查错误。当你开始考虑因素时,每个选项会慢一点,但我认为 subSequnce()选项仍会击败它们。您必须知道确切的参数和期望,以确定每个选项的容错程度。
答案 2 :(得分:2)
虽然正则表达式很好,但您也可以使用类java.util.StringTokenizer
来完成这项工作。优点是更人性化的代码。
StringTokenizer tokenizer = new StringTokenizer(inputString, "\"");
tokenizer.nextElement();
String path = tokenizer.nextElement();
然后你去。
答案 3 :(得分:1)
java.util.regex是你的朋友。
答案 4 :(得分:1)
你可以使正则表达式比jinguy短一些。基本上只是没有“s”的RHS。
String regex = ".* = \"(.*)\"";