2015-10-20 164 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与浮动变量分开。请记住:使用正则表达式变得比您想要解决的问题更加困难。

“我有问题,并决定用正则表达式解决它,现在我遇到了两个问题”。

相关问题