Java:如何使用正则表达式将字符串分成几部分?

时间:2015-10-20 01:20:21

标签: java regex string parsing floating-point

我必须将Java String解析为3个独立的案例:

  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. 否则我什么都不做
  4. 所以我猜#1和#2的正则表达式是PREFIX[\(]?[-]?[0-9]*\.?[0-9]*[\)]?=\S*,但是如何使用它来提取这两个部分呢?

    顺便说一句,我不需要担心浮动在科学中表达(&#34; %e&#34;)符号

    更新:有点澄清:PREFIX是固定字符串。所以有效字符串的例子是:

    • PREFIX=fOo1234bar - 我需要提取fOo1234bar
    • PREFIX(-1.23456)=SomeString - 此处我需要提取-1.23456SomeString
    • PREFIX(0.20)=1A2b3C - 此处我需要提取0.201A2b3C

2 个答案:

答案 0 :(得分:1)

鉴于你的正则表达式,我会假设<signed_float> 支持科学记数法。

用于匹配{/ 3}}的javadoc中列出的float / double的正则表达式。

在这种情况下,Double.valueOf(String)将是:

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>

答案 1 :(得分:0)

IF 我理解你要做的事情:

我会为&#34; PREFIX()=&#34; case,和另一个&#34; PREFIX =&#34;。我会用第一个测试;如果它适合,则执行逻辑,如果不适合,则尝试下一个。这给你两个更简单的正则表达式担心。从执行带有Pattern的检查返回的Matcher为您提供匹配的字符串的长度等,因此您可以使用原始字符串上的子字符串来提取您已找到的内容。

你不能说PREFIX是固定大小的;如果没有,那么组可以帮助您将PREFIX与浮动变量分开。请记住:使用正则表达式比你试图解决的问题变得更难。

&#34;我遇到了问题,决定用正则表达式来解决它。现在我遇到了两个问题&#34;。