正则表达式在java中的相同或下一行上查找十进制或非十进制数

时间:2016-05-31 11:28:25

标签: java regex

我有以下文字

My thing 0.02
My thing 100.2
My thing 65
My thing
0.03
My thing
13
My thing
    45.67 stuff

我想提取“我的东西”。并且与它相关联的数字可以将它拆分并放入地图中(我知道在这个例子中键会相互过度 - 这只是我在这里使用的例子 - 我的东西实际上会被合并到它自己的地图中所以它不是问题)

Mything=0.02,Mything=100.2,Mything=65,Mything=0.03,Mything=13,Mything=45.67

我试过

 Pattern match_pattern = Pattern.compile(start.trim()+"\\n.*?\\d*\\.\\d*\\s",Pattern.DOTALL);

但这并不是我想做的事情

2 个答案:

答案 0 :(得分:1)

整数或小数的模式可能是compiled query,所以如果你想查找\d+(\.\d+)?后跟那个数字和两者之间的可选空格,你可以尝试模式start(行中断也是空格)并将模式应用于多行文本(即不要将其应用于单独的行)。如果两者之间可以存在任何内容(不仅仅是空格),那么您希望将start + "\\s*\\d+(\\.\\d+)?"与DOT_ALL标志一起使用,而不是.*

表达式\s*

的细分
  • start + "\\s*\\d+(\\.\\d+)?"包含从其他地方提供的子表达式。如果你想确保它被视为文字(即start之类的特殊字符,则不会被解释为用*\Q包裹,即\E)< / LI>
  • "\\Q" + start + "\\E"(或Java字符串文字中的\s*表示&#34;任何空格&#34;其中还包括换行符
  • \\s*(或Java字符串文字中的\d+(\.\d+)?表示&#34;一个或多个数字后跟零或一个由点组成的组和一个或多个数字&#34; - 这意味着&#34;点和一个或多个数字&#34; part是可选的,但如果有一个点,则必须后跟至少一个数字。

附加说明:如果您想访问捕获组,例如提取您想要为可选部分使用非捕获组的数字,并将整个(子)表达式包装在捕获组中,例如, \\d+(\\.\\d+)?。在这种情况下,如果您使用(\d+(?:\.\d+)?)Pattern,则可以使用Matcher访问该号码 - 或者如果您将group(1)包裹在一个组中(与start类似,您可以将第一部分设为"(\\Q" + start + "\\E)\\s*(\\d+(?:\\.\\d+)?)",将第二部分设为group(1)

答案 1 :(得分:1)

如果您只想提取记录,可以像

那样进行
    String s = "My thing 0.02\nMy thing 100.2\nMy thing 65\nMy thing\n"+
                "0.03\nMy thing\n13\nMy thing\n    45.67 stuff\n";
    Matcher m = Pattern.compile("(My thing)\\s*(\\d+(?:\\.\\d+)?)").matcher(s);

然后遍历匹配并添加到字典,或者什么......;)

    while (m.find()) {
        // Add to dictionary, group 1 is key, 2 is value
        System.out.println("Found: " + m.group(0)+ ":" + m.group(1)+":" + m.group(2));
    }

See it here at ideone