【问题标题】:Java: how to separate string into parts using regex?Java:如何使用正则表达式将字符串分成几部分?
【发布时间】:2015-10-20 01:20:20
【问题描述】:

我必须将 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") 表示法表示的浮点数

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

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

【问题讨论】:

  • "如何使用它来提取这两个部分?" 捕获组。

标签: java regex string parsing floating-point


【解决方案1】:

鉴于您的正则表达式,我假设 <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>

【讨论】:

    【解决方案2】:

    如果我明白你想做什么:

    我会为“PREFIX()=”的情况创建一个表达式,并为“PREFIX=”创建另一个表达式。我会用第一个测试;如果合适,执行逻辑,如果不合适,尝试下一个。这为您提供了两个更简单的正则表达式来担心。使用 Pattern 执行检查返回的 Matcher 会为您提供匹配的字符串的长度等,因此您可以使用原始字符串上的子字符串来提取您找到的内容。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-20
      • 2011-04-16
      • 2016-04-21
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 2012-12-24
      相关资源
      最近更新 更多