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

标签 java regex string parsing floating-point

我必须将 Java 字符串解析为 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. 否则我什么也不做

所以我猜 #1 和 #2 的正则表达式是 PREFIX[\(]?[-]?[0-9]*\.?[0-9]*[\)]?=\S* ,但是如何使用它来提取这两部分?

顺便说一句,我不需要担心以科学(“%e ”)表示法表示的 float

更新:澄清一下:PREFIX 是一个固定字符串。因此有效字符串的示例是:

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

最佳答案

根据您的正则表达式,我假设 <signed_float> 支持科学记数法。

用于将 float/double 与 Double.valueOf(String) 的 javadoc 中列出的匹配的正则表达式。

在这种情况下,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>

关于Java:如何使用正则表达式将字符串分成几部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33226518/

相关文章:

Java WeakHashMap 类

java - 利用基本的 Java 知识,以及下一步该怎么做

javascript - JS使用toString获取字符串中的数组(不改变实际数组)

c++:将地址存储为字符串

java - 初始化可能失败的惰性单例的哪种实现?

java - 有没有办法稍后使用 Twilio 发送短信

php - MySql REGEXP 通过包含特定单词进行多单词搜索

javascript - 正则表达式删除 - 除非前面有另一个运算符

ruby-on-rails - 正则表达式挑战

c++ - 通过套接字将数据作为字符串发送的好方法是什么?