问题描述
我必须将Java字符串解析为3种单独的情况:
I have to parse a Java String into 3 separate cases:
- 如果它的格式为
"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
) - 否则我什么都不做
- If it has the form
"PREFIX(<signed_float>)=<Some_alpha_num_string>"
, I need to extract<signed_float>
into one (Double
) variable,<Some_alpha_num_string>
into another (String
) variable and ignore the rest. - Otherwise, if it has the form
"PREFIX=<Some_alpha_num_string>"
, I save<Some_alpha_num_string>
and set theDouble
to some default (say0.0
) - Otherwise I do nothing
所以我猜#1和#2的正则表达式是PREFIX[\(]?[-]?[0-9]*\.?[0-9]*[\)]?=\S*
,但是我怎么用它来提取两部分呢?
So I guess the regex for #1 and #2 would be PREFIX[\(]?[-]?[0-9]*\.?[0-9]*[\)]?=\S*
, but how do I use it to extract the two pieces?
顺便说一句,我不必担心以科学("%e
")表示法来表示浮点数
BTW, I don't need to worry about the float being expressed in the scientific ("%e
") notation
更新:需要澄清的一点:PREFIX
是固定字符串.因此,有效字符串的示例为:
UPDATE: A bit of clarification: PREFIX
is a fixed string. So examples of valid strings would be:
-
PREFIX=fOo1234bar
-在这里我需要提取fOo1234bar
-
PREFIX(-1.23456)=SomeString
-在这里我需要提取-1.23456
和SomeString
-
PREFIX(0.20)=1A2b3C
-在这里我需要提取0.20
和1A2b3C
PREFIX=fOo1234bar
-- here I need to extractfOo1234bar
PREFIX(-1.23456)=SomeString
-- here I need to extract-1.23456
andSomeString
PREFIX(0.20)=1A2b3C
-- here I need to extract0.20
and1A2b3C
推荐答案
鉴于您的正则表达式,我认为<signed_float>
不支持科学表示法.
Given your regex, I'll assume that <signed_float>
does not support scientific notation.
正则表达式,用于将浮点数/双精度数与 Double.valueOf(String).
Regex for matching a float/double to listed in the javadoc for 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>
这篇关于Java:如何使用正则表达式将字符串分成多个部分?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!