Muszę parsować ciąg Java w 3 oddzielnych przypadkach:
- Jeśli ma formularz
"PREFIX(<signed_float>)=<Some_alpha_num_string>"
, Muszę wyodrębnić<signed_float>
w jeden (Double
) zmienna,<Some_alpha_num_string>
w inny (String
) Zmienna i zignoruj resztę. - W przeciwnym razie, jeśli ma formę
"PREFIX=<Some_alpha_num_string>"
, Oszczędzam<Some_alpha_num_string>
i ustawDouble
do niektórych domyślnych (np0.0
) - W przeciwnym razie nic nie robię
Więc myślę, że regex dla # 1 i # 2 będzie PREFIX[(]?[-]?[0-9]*.?[0-9]*[)]?=S*
, ale jak mogę go użyć do wyodrębnienia dwóch elementów?
BTW, nie muszę się martwić, że pływak jest wyrażony w nauce ("%e
") notacja
AKTUALIZACJA: Trochę wyjaśnienia: PREFIX
jest ustalonym łańcuchem. Zatem przykładami prawidłowych ciągów byłyby:
PREFIX=fOo1234bar
- tutaj muszę wyodrębnićfOo1234bar
PREFIX(-1.23456)=SomeString
- tutaj muszę wyodrębnić-1.23456
iSomeString
PREFIX(0.20)=1A2b3C
- tutaj muszę wyodrębnić0.20
i1A2b3C
Odpowiedzi:
0 dla odpowiedzi № 1Biorąc pod uwagę twoje regex, założę to <signed_float>
robi nie wspierać notację naukową.
Regex dla dopasowania float / double do listy w javadoc dla Double.valueOf (String).
W takim przypadku regex byłoby:
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>
Lub jako ciąg znaków:
"PREFIX(?:\(([+-]?(?:\d+\.?\d*|\.\d+))\))?=(\S*)"
Zróbmy to:
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) + """);
}
Wydajność:
"fOo1234bar"
-1.23456, "SomeString"
0.2, "1A2b3C"
<do nothing>
0 dla odpowiedzi nr 2
JEŚLI Rozumiem, co próbujesz zrobić:
Zrobiłabym wyrażenie dla "PREFIX () ="przypadku, a kolejne dla "PREFIX =". Testowałem z pierwszym; jeśli pasuje, wykonaj logikę, a jeśli tak się nie stanie, wypróbuj następną.To powoduje, że martwisz się dwoma prostszymi wyrażeniami wyrażeń. Matcher, który jest zwracany po wykonaniu sprawdzenia za pomocą Wzorca, podaje długość ciągu znaków dopasowane itp., aby można było użyć podciągów na oryginalnym łańcuchu, aby wyodrębnić to, co znalazłeś.
Nie możesz powiedzieć, czy PREFIX ma stały rozmiar, jeślinie, wtedy grupy mogą pomóc Ci oddzielić PREFIX od zmiennych float. Pamiętaj tylko: PRAWDZIWIE proste jest używanie wyrażeń regularnych, aby stać się trudniejszym niż problem, który próbujesz rozwiązać.
"Miałem problem i postanowiłem go rozwiązać za pomocą wyrażeń regularnych, teraz mam dwa problemy".