在Java中解析String的有效方法是什么?

时间:2009-07-29 14:43:42

标签: java regex string parsing

如何使用Java解析以下String以提取文件路径?

?代表任意数量的随机字符

_代表任意数量的空格(无新行)

?[LoadFile]_file_=_"foo/bar/baz.xml"?

示例:

10:52:21.212 [LoadFile] file = "foo/bar/baz.xml"

应提取foo/bar/baz.xml

5 个答案:

答案 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 = ".* = \"(.*)\"";