Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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 - Fatal编程技术网

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

正则表达式在java中查找同一行或下一行的十进制数或非十进制数,java,regex,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 我想提取“我的东西”,与之相关的数字可以将其拆分并放入地图中(我知道在本例中键会相互重叠-这只是我在这里使用的示例-我的东西实际上会合并到自己的地图中,因此这不是问题) 我试过了 Pattern match_pattern = Pattern.compile(start.trim()+"\\n.*

我有以下文字

My thing 0.02
My thing 100.2
My thing 65
My thing
0.03
My thing
13
My thing
    45.67 stuff
我想提取“我的东西”,与之相关的数字可以将其拆分并放入地图中(我知道在本例中键会相互重叠-这只是我在这里使用的示例-我的东西实际上会合并到自己的地图中,因此这不是问题)

我试过了

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

但是这并不是我想要的

整数或小数的模式可能是
\d+(\.\d+)
,所以如果您想查找
start
,然后是该数字和可选空格,您可以尝试模式
start+“\\s*\\d+(\\.\\d+)”
(换行符也是空格)并将模式应用于多行文字(即,不要将其应用于单独的行)。如果中间可能有任何内容(不仅仅是空白),您将希望使用
*
和DOT\u ALL标志,而不是
\s*

表达式
start+“\\s*\\d+(\\.\\d+)”的细分

  • start
    包含从其他地方提供的子表达式。如果您想确保它被视为文字(例如,像
    *
    等特殊字符不被解释,请使用
    \Q
    \e
    ,即
    “\\Q”+start+“\\e”
    将其包装起来)
  • \s*
    (或Java字符串文字中的
    \\s*
    )表示“任何空白”,也包括换行符
  • \d+(\.\d+)
    (或Java字符串文字中的
    \\d+(\\.\\d+)
    )表示“一个或多个数字后跟零或一个由点和一个或多个数字组成的组”-这意味着“点和一个或多个数字”部分是可选的,但如果有点,则必须后跟至少一个数字

附加说明:如果要访问捕获组,例如要提取号码,则需要将非捕获组用于可选部分,并将整个(子)表达式包装在捕获组中,例如
(\d+(?:\。\d+)
)。在这种情况下,如果您使用
模式
匹配器
,您可以使用
组(1)
-访问号码,或者如果您也将
开始
包装在一个组中(如
“(\\Q“+start+”\\E)\\s*(\\d+(?:\\.\\d+)”
),您将获得第一部分作为
组(1)
,第二部分作为
组(2)

如果您只是想提取记录,您可以这样做

    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);
然后循环查找匹配项并添加到字典中,或者其他任何内容……;)


.

对不起。start是一个导入的字符串。这是正确的。我从一个文本文件中逐行阅读以进行匹配,因此开始指的是为进行匹配而导入的每一行,然后请共享相关代码,您必须了解整个图片。您是指带小数点和不带小数点的数字吗?真的,这种不分青红皂白地使用“decimal”来表示绝对关于一个数字的任何事情都必须停止。是的,有小数点和没有小数点我混淆了标签,对不起。不过,您所做的并不符合逻辑:您逐行阅读,然后使用正则表达式跨行搜索一些文本。这注定要失败。
    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));
    }