Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何拆分包含多个键值对的字符串_Java_Regex_String Matching - Fatal编程技术网

Java 如何拆分包含多个键值对的字符串

Java 如何拆分包含多个键值对的字符串,java,regex,string-matching,Java,Regex,String Matching,我有一个字符串: Single line : Some text Multi1: multi (Va1) Multi2 : multi (Va2) Multi3 : multi (Val3) Dots....20/12/2013 (EOY) 我试图检索所有的键值对。我的第一次尝试 (单线|多[0-9]{1}|点)(*:?[.]*|*:?)() 似乎可以工作,但不能在一行上处理多个键值对。有什么方法可以做到这一点吗?我不记得确切的语法,但我认为它是这样的: while (matcher.f

我有一个字符串:

Single line : Some text
Multi1: multi (Va1)    Multi2 : multi (Va2) Multi3 : multi (Val3)
Dots....20/12/2013 (EOY)
我试图检索所有的键值对。我的第一次尝试

(单线|多[0-9]{1}|点)(*:?[.]*|*:?)()


似乎可以工作,但不能在一行上处理多个键值对。有什么方法可以做到这一点吗?

我不记得确切的语法,但我认为它是这样的:

while (matcher.find()) {
  String match = matcher.group();
}
这里的目标是,您需要迭代当前行,并告诉它“当您仍在查找内容时,请将这行上匹配的字符串返回给我。”因为在同一行上有多个匹配项,它应该继续为您提取结果。作为Matcher的参考


不幸的是,这是Java不太适合这类应用的另一个原因,在任何人让我理解之前,我说这是对Java API的批评,而不是对语言的批评。

您可以使用以下模式:

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"));
    }
}
publicstaticvoidmain(字符串[]args){
String s=“单行:一些文本\n”
+“Multi1:multi(Va1)Multi2:multi(Va2)”
+“Multi3:multi(Val3)\n”
+“Dots….20/12/2013(EOY)”;
字符串wd=“[^\\s.:]”+(?:[^\\s\\n]+[^\\s.:]+)*”;
模式p=Pattern.compile(“(?”+wd+”)
+“\\s*(?::\\.+)\\s*”
+“(?”+wd+“(?:\\s*\\([^)]+\\))”
+“(?!\\s*:)(?=\\s |$)”;
匹配器m=匹配器p;
while(m.find()){
System.out.println(m.group(“key”)+“->”+m.group(“value”);
}
}
试试这个:

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 
说明:

  • 我将键和值限制为“以字母数字开头”, “包含任意数量的字母数字、空格或斜杠”
  • 我将分隔符限制为“可选空间、:、可选空间”或 “可选空间,任意数量的连续点,可选空间”
  • 我使用第1组和第3组来定义
    模式
  • 第2组用于提供上述备用分离器
  • 最后,
    模式
    在末尾用新的 行,或带有一个开放的圆括号,或带有一个空格,后跟一个 打开圆形支架

请注意,您不能在前向或后向组中使用量词,因此会出现重复

我知道语法,但正则表达式将第2行第一个分号之后的所有内容都视为值,而不是将其拆分。