簡體   English   中英

正則表達式在Java的同一行或下一行中查找十進制或非十進制數字

[英]Regex to find decimal or non decimal number on same or next line in java

我有以下文字

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

我想提取“我的東西”,並將與之關聯的數字將其拆分並放入地圖中(我知道在此示例中,按鍵會彼此過度書寫-這只是示例Im在此處使用-我的事物將實際上被合並到自己的地圖中,所以這不是問題)

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);

但這並不能完全滿足我的要求

整數或十進制的模式可能是\\d+(\\.\\d+)? 所以,如果你想尋找start ,隨后該號碼,在兩者之間,你可以嘗試的模式可選空白start + "\\\\s*\\\\d+(\\\\.\\\\d+)?" (換行符也是空白),並將模式應用於多行文本(即,不要將其應用於單獨的行)。 如果兩者之間可以有任何內容(不僅限於空格),您將希望使用.*和DOT_ALL標志而不是\\s*

表達式start + "\\\\s*\\\\d+(\\\\.\\\\d+)?"細分start + "\\\\s*\\\\d+(\\\\.\\\\d+)?"

  • start包含一個從其他位置提供的子表達式。 如果要確保將其視為文字(即不解釋*等特殊字符,請用\\Q\\E換行,即"\\\\Q" + start + "\\\\E"
  • \\s* (或Java字符串文字中的\\\\s* )表示“任何空格”,其中還包括換行符
  • \\d+(\\.\\d+)? (或Java字符串文字中的\\\\d+(\\\\.\\\\d+)? )表示“一個或多個數字,后跟零或一組由點和一個或多個數字組成的組”-這表示“點和一個或更多數字”部分是可選的,但如果有一個點,則必須至少跟一個數字。

附加說明:如果要訪問捕獲組,例如提取數字,則要對可選部分使用非捕獲組,並將整個(子)表達式包裝在捕獲組中,例如(\\d+(?:\\.\\d+)?) 在這種情況下,如果要使用PatternMatcher ,則可以使用group(1)來訪問數字-或者也可以將start包裝在一個組中(例如"(\\\\Q" + start + "\\\\E)\\\\s*(\\\\d+(?:\\\\.\\\\d+)?)" )),您將得到第一部分作為group(1)和第二部分作為group(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);

然后遍歷所有匹配項並添加到字典中,或者添加任何內容...;)

    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));
    }

在ideone上看到它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM