我必须将 Java 字符串解析为 3 个不同的情况:
- 如果它的形式为
"PREFIX(<signed_float>)=<Some_alpha_num_string>"
,我需要将<signed_float>
提取到一个 (Double
) 变量中,将<Some_alpha_num_string>
提取到另一个 (String
) 变量中,并忽略其余部分。 - 否则,如果它的形式为
"PREFIX=<Some_alpha_num_string>"
,我会保存<Some_alpha_num_string>
并将Double
设置为某个默认值(例如0.0
) - 否则我什么也不做
所以我猜 #1 和 #2 的正则表达式是 PREFIX[\(]?[-]?[0-9]*\.?[0-9]*[\)]?=\S*
,但是如何使用它来提取这两部分?
顺便说一句,我不需要担心以科学(“%e
”)表示法表示的 float
更新:澄清一下:PREFIX
是一个固定字符串。因此有效字符串的示例是:
-
PREFIX=fOo1234bar
-- 这里我需要提取fOo1234bar
-
PREFIX(-1.23456)=SomeString
-- 这里我需要提取-1.23456
和SomeString
-
PREFIX(0.20)=1A2b3C
-- 这里我需要提取0.20
和1A2b3C
最佳答案
根据您的正则表达式,我假设 <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/