/ / Gdzie metoda split () w Javie zaczyna dopasowywać wyrażenie regularne do łańcucha? - java, regex, string, split

Gdzie metoda split () w Javie zaczyna dopasowywać wyrażenie regularne do łańcucha? - java, regex, string, split

Robiłem zamieszanie z metodą split () wJava, gdy natknąłem się na problem, którego nie mogłem zrozumieć. Byłem ciekaw, dokąd dokładnie metoda podziału zaczyna wyszukiwać dopasowania regex: na pierwszym znaku, przed lub po?

Podany ciąg "test":

Jeśli metoda podziału rozpoczyna się przed pierwsząznak wtedy powinien być pusty ciąg przed ciągiem "test", a podział na pusty ciąg powinien zwrócić tablicę o długości 6, ale ma długość 5.

System.out.println("test".split("",-1).length);

Tak więc metoda podziału nie zaczyna się przed podanym łańcuchem.

Jeśli metoda podziału rozpoczyna się od pierwszego znakudany ciąg znaków nie powinien być "t rozdzielany z wyrażeniem" Z * "zwracać tablicę o długości 6 z wiodącym pustym ciągiem znaków, ponieważ pierwszy znak rzeczywiście nie jest Z (stąd 0 lub więcej razy)? Jednak zwraca tablicę o długości 5 .

System.out.println("test".split("Z*",-1).length);

Więc przez indukcję metoda podziału rozpoczyna się po pierwszym znaku ... ale wyraźnie nie, ponieważ poniższy kod działa zgodnie z oczekiwaniami:

System.out.println("test".split("t",-1).length);
Output: 3

Więc gdzie dokładnie metoda podziału rozpoczyna wyszukiwanie dopasowań wyrażenia regularnego? Albo jaka dokładnie jest luka w moim rozumowaniu?

Odpowiedzi:

1 dla odpowiedzi № 1

Możesz odczytać kod źródłowy jdk online. Oto podział od OpenJdk 8.

String.split ma optymalizację ścieżki szczęśliwy dla pojedynczych ciągów znaków, ale większość prac jest delegowana do Pattern.split. Podział wzoru ma specjalny przypadek dla dopasowania o zerowej szerokości na początku ciągu.