/ / Java: jak rozdzielić ciąg na części za pomocą wyrażenia regularnego? - java, regex, string, parsowanie, zmiennoprzecinkowe

Java: jak rozdzielić ciąg na części za pomocą wyrażenia regularnego? - java, regex, string, parsowanie, zmiennoprzecinkowe

Muszę parsować ciąg Java w 3 oddzielnych przypadkach:

  1. 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ę.
  2. W przeciwnym razie, jeśli ma formę "PREFIX=<Some_alpha_num_string>", Oszczędzam <Some_alpha_num_string> i ustaw Double do niektórych domyślnych (np 0.0)
  3. 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 i SomeString
  • PREFIX(0.20)=1A2b3C - tutaj muszę wyodrębnić 0.20 i 1A2b3C

Odpowiedzi:

0 dla odpowiedzi № 1

Biorą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".