我有一个字符串:
Single line : Some text
Multi1: multi (Va1) Multi2 : multi (Va2) Multi3 : multi (Val3)
Dots....20/12/2013 (EOY)
我正在尝试检索所有键值对。我的第一次尝试
(单行|多[0-9] {1} |点)(*:? [。] * | *:?)(。)< / p>
似乎有效,但不能在一行上处理多个键值对。有没有办法实现这个目标?
答案 0 :(得分:1)
您可以使用此模式:
public static void main(String[] args) {
String s = "Single line : Some text\n"
+ "Multi1: multi (Va1) Multi2 : multi (Va2) "
+ "Multi3 : multi (Val3)\n"
+ "Dots....20/12/2013 (EOY)";
String wd = "[^\\s.:]+(?:[^\\S\\n]+[^\\s.:]+)*";
Pattern p = Pattern.compile("(?<key>" + wd + ")"
+ "\\s*(?::|\\.+)\\s*"
+ "(?<value>" + wd + "(?:\\s*\\([^)]+\\))?)"
+ "(?!\\s*:)(?=\\s|$)");
Matcher m = p.matcher(s);
while (m.find()) {
System.out.println(m.group("key")+"->"+m.group("value"));
}
}
答案 1 :(得分:1)
试试这个:
String text = "Single line : Some text\r\n" +
"Multi1: multi (Va1) Multi2 : multi (Va2) Multi3 : multi (Val3)\r\n" +
"Dots....20/12/2013 (EOY)";
Pattern pattern = Pattern.compile("(\\p{Alnum}[\\p{Alnum}\\s/]+?)\\s?(:|\\.+)\\s?(\\p{Alnum}[\\p{Alnum}\\s/]+?)(?=($|\\()|(\\s\\())", Pattern.MULTILINE);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println(matcher.group(1) + "-->" + matcher.group(3));
}
输出:
Single line-->Some text
Multi1-->multi
Multi2-->multi
Multi3-->multi
Dots-->20/12/2013
说明:
Pattern
。Pattern
最后以新的分隔
线,或用一个开放的圆形支架,或者有一个空格后跟一个
打开圆括号。请注意,您不能在前瞻或后瞻组中使用量词,因此重复。
答案 2 :(得分:0)
我不记得确切的语法,但我认为它是这样的:
while (matcher.find()) {
String match = matcher.group();
}
这里的目标是你需要迭代当前行并告诉它“当你还在寻找东西时,回到我这条匹配的线上的字符串。”由于您在同一行上有多个匹配项,因此应该继续为您提取结果。 Here is the JavaDoc以Matcher为参考。
令人遗憾的是,Java真的不适合这类事情的另一个原因,在任何人对我的理解之前我都明白,我说这是对Java API的批评,而不是语言。