2015-10-20 163 views
0

我要解析一個Java字符串到3個獨立的情況:Java:如何使用正則表達式將字符串分成多個部分?

  1. 如果它的形式是"PREFIX(<signed_float>)=<Some_alpha_num_string>",我需要提取<signed_float>成一個(Double)可變,<Some_alpha_num_string>成另一種(String)變量,並忽略其餘。
  2. 否則,如果它的形式是"PREFIX=<Some_alpha_num_string>",我省<Some_alpha_num_string>並設置Double一些默認的(比如0.0
  3. 否則我什麼也不做

所以我想正則表達式#1和#2將是PREFIX[\(]?[-]?[0-9]*\.?[0-9]*[\)]?=\S*,但我如何使用它來提取這兩件?

順便說一句,我不需要擔心漂浮在科學(「%e」)符號所表達

UPDATE:澄清一下:PREFIX是一個固定的字符串。因此,有效的字符串的例子是:

  • PREFIX=fOo1234bar - 在這裏我需要提取fOo1234bar
  • PREFIX(-1.23456)=SomeString - 在這裏我需要提取​​和SomeString
  • PREFIX(0.20)=1A2b3C - 在這裏我需要提取0.201A2b3C
+0

「*我如何使用它來提取這兩塊?*」捕獲組。 – user1803551

回答

0

鑑於你的正則表達式,我假設<signed_float>確實不是支持科學記數法。

正則表達式匹配的浮子/雙到在Javadoc列出Double.valueOf(String)

在這種情況下,regex是:

PREFIX   Matching exact letters "PREFIX" 
(?:    Start optional section 
    \(    Matching exact character "(" 
    (    Start content capture #1 <signed_float> 
    [+-]?   Matches optional sign 
    (?:   Start choice section 
     \d+\.?\d*  Matches <digits> ["."] [<digits>] 
    |    Choice separator 
     \.\d+   Matches "." <digits> 
    )    End choice section 
)    End content capture #1 
    \)    Matching exact character ")" 
)?    End optional section 
=    Matching exact character "=" 
(\S*)   Capture #2 <Some_alpha_num_string> 

或字符串:

"PREFIX(?:\\(([+-]?(?:\\d+\\.?\\d*|\\.\\d+))\\))?=(\\S*)" 

測試一下:

public static void main(String[] args) { 
    test("PREFIX=fOo1234bar"); 
    test("PREFIX(-1.23456)=SomeString"); 
    test("PREFIX(0.20)=1A2b3C"); 
    test("sadfsahlhjladf"); 
} 
private static void test(String text) { 
    Pattern p = Pattern.compile("PREFIX(?:\\(([+-]?(?:\\d+\\.?\\d*|\\.\\d+))\\))?=(\\S*)"); 
    Matcher m = p.matcher(text); 
    if (! m.matches()) 
     System.out.println("<do nothing>"); 
    else if (m.group(1) == null) 
     System.out.println("'" + m.group(2) + "'"); 
    else 
     System.out.println(Double.parseDouble(m.group(1)) + ", '" + m.group(2) + "'"); 
} 

輸出:

'fOo1234bar' 
-1.23456, 'SomeString' 
0.2, '1A2b3C' 
<do nothing> 
0

IF我明白你想要做什麼:

我會爲「PREFIX()=」的情況,另一個爲「PREFIX =」的表達式。我會用第一個測試;如果它合適,執行邏輯,如果不合適,請嘗試下一個。這給你兩個更簡單的正則表達式擔心。通過使用Pattern執行檢查而返回的匹配器會爲您提供匹配的字符串的長度等,因此您可以使用原始字符串的子字符串來提取您找到的內容。

你不說PREFIX是否是固定大小;如果沒有,那麼團隊可能會幫助您將PREFIX與浮動變量分開。請記住:使用正則表達式變得比您想要解決的問題更加困難。

「我有問題,並決定用正則表達式解決它,現在我遇到了兩個問題」。

相關問題