/ / Java - Jak działa metoda split (regex, limit)? [duplikat] - java, string, split

Java - jak działa metoda split (regex, limit)? [duplicate] - java, string, split

Staram się zrozumieć, w jaki sposób działa metoda split i mam w tej kwestii niewielkie zamieszanie. W tym przykładzie podanym na stronach dokumentacji wyroczni,

String str = "boo:and:foo";

String[] str1 = str.split("o",2);

Output
b
o:and:foo

Łatwo to zrozumieć, że łańcuch został dosłownie podzielony w momencie pojawienia się pierwszego „o”

ale dla

String[] str1 = str.split("o",3);

Output:
b

:and:foo

Jak to wygląda jako takie?

Odpowiedzi:

3 dla odpowiedzi № 1

Co rozumiem z dokumentacji:

Parametr limitu określa liczbę razy, gdy wzór jest zastosowane i dlatego wpływa na długość wynikowej tablicy. Jeśli granica n jest większa niż zero, a następniewzór zostanie zastosowany w większość n - 1 razy, długość tablicy nie będzie większa niż n i ostatni wpis tablicy będzie zawierał wszystkie dane wejściowe poza ostatnim dopasowanym ogranicznik. Jeśli n nie jest dodatnie, wzór będziestosowane jako wiele razy, jak to możliwe, a tablica może mieć dowolną długość. Jeśli n wynosi zero wzór zostanie zastosowany tyle razy, ile to możliwe, tablica może mieć dowolną długość, a końcowe puste ciągi zostaną odrzucone.

Oznacza to wymyślenie lub obcięcie go na czas na sznurku s, więc Pozwala przeanalizować jeden po drugim, aby lepiej zrozumieć:

Limit 1

String[] spl1 = str.split("o", 1);

Oznacza to podzielenie go lub wycięcie na jednym ciągu na łańcuchu o w tym przypadku otrzymasz wszystkie dane wejściowe:

[boo:and:foo]
1

Limit 2

String[] spl1 = str.split("o", 2);

Co oznacza odcięcie go raz o więc zrobię przerwę w pierwszym o

    boo:and:foo
-----^

w tym przypadku otrzymasz dwa wyniki:

[b,o:and:foo]
1 2

Limit 3

String[] spl1 = str.split("o", 3);

Co oznacza przecięcie go dwa razy w pierwszym o i na drugi o

    boo:and:foo
1----^^--------------2

w tym przypadku otrzymasz trzy wyniki:

[b, ,:and:foo]
1 2  3

Limit 4

String[] spl1 = str.split("o", 4);

Co oznacza przecięcie go trzy razy w pierwszym, drugim i trzecim o

     boo:and:foo
1_____^^      ^
|___2  |___3

w tym przypadku otrzymasz cztery wyniki:

[b, ,:and:f,o]
1 2 3      4

Limit 5

String[] spl1 = str.split("o", 5);

Co oznacza przecięcie go cztery razy w pierwszym, drugim, trzecim i czwartym o

     boo:and:foo
1_____^^      ^^
|___2  ||___4
|____3

w tym przypadku otrzymasz pięć wyników:

[b, ,:and:f, , ]
1 2  3     4 5

Prosta animacja, aby zrozumieć więcej:

Jak działa metoda split ()?


1 dla odpowiedzi nr 2

Drugi parametr określa liczbę przypadków, w których wzorzec musi zostać zastosowany.

Z dokumentów Java:

Parametr limitu kontroluje liczbę razywzór jest zastosowane i dlatego wpływa na długość wynikowej tablicy. Jeśli limit n jest większy niż zero, a wzór zostanie zastosowany w większość n - 1 razy, długość tablicy nie będzie większa niż n i ostatni wpis tablicy będzie zawierał wszystkie dane wejściowe poza ostatnim dopasowanym ogranicznik. Jeśli n nie jest dodatnie, wzór zostanie zastosowany jako wiele razy, jak to możliwe, a tablica może mieć dowolną długość. Jeśli n wynosi zero wzór zostanie zastosowany tyle razy, ile to możliwe, tablica może mieć dowolną długość, a końcowe puste ciągi zostaną odrzucone.

Przykład:

1) jeśli limit jest ustawiony na zero (str.split ("o", 0)) następnie zgodnie z dokumentami java wzorzec zostanie zastosowany tyle razy, ile będzie to możliwe, więc wynikiem będzie:

[b,: i: f]

2) ale jeśli ustawisz limit na wartość niezerową (np.sol. 1 lub 2) wzór zostanie zastosowany n-1 razy (np. Dla limitu 1 wzór zostanie zastosowany 0 razy, a dla 2 będzie zastosowany 1 raz), więc wynik będzie poniżej:

[boo: and: foo] // dla str.split ("o", 1) zastosowano 0 raz.

[b, o: and: foo] // dla str.split ("o", 2) zastosowano 1 raz.

[b,: i: foo] // dla str.split („o”, 3) zastosowano 2 razy.


0 dla odpowiedzi № 3

Drugi argument to liczba przypadków zastosowania wyrażenia regularnego w ciągu. Więc jeśli limit wynosi 3, dostaniesz b,,:and:foo: Podział łańcucha na token w momencie wystąpienia wzorca. Uwaga limit może być większy niż liczba wystąpień wyrażenia regularnego w rzeczywistym ciągu.


0 dla odpowiedzi nr 4
String[] split(String regex, int limit)

Drugi parametr ogranicza liczbę łańcuchów zwracanych po podziale.

Dla np. split("anydelimiter", 3) zwróci tablicę tylko 3 łańcuchów, mimo że separator jest obecny w ciągu więcej niż 3 razy.

Jeśli limit jest ujemny, to zwracana tablicaposiadałby tak dużo podciągów, jak to tylko możliwe, ale gdy limit wynosi zero, zwrócona tablica będzie zawierała wszystkie podciągi z wyłączeniem pustych ciągów końcowych.


0 dla odpowiedzi № 5

Żądanie metody dla dwóch parametrów split(String regex, int limit).
regex - ograniczające wyrażenie regularne;
limit - próg wyniku.

Dokumentacja Java


0 dla odpowiedzi № 6
**regex** − the delimiting regular expression

String Str = new String("boo:and:foo:com:boo");
System.out.println("Return value1: ");
for (String retval : Str.split(":", 2)) {
System.out.println(retval);
}
System.out.println();
System.out.println("Return value2: ");
for (String retval : Str.split(":", 3)) {
System.out.println(retval);
}
System.out.println();
System.out.println("Return value3: ");
for (String retval : Str.split(":", 0)) {
System.out.println(retval);
}
System.out.println();
System.out.println("Return value4: ");
for (String retval : Str.split(":")) {
System.out.println(retval);
}
}

Sam sprawdź każdą wartość1,2,3,4


0 dla odpowiedzi № 7

oto dokumentacja limitu

<p> The <tt>limit</tt> parameter controls the number of times the
* pattern is applied and therefore affects the length of the resulting
* array.  If the limit <i>n</i> is greater than zero then the pattern
* will be applied at most <i>n</i>&nbsp;-&nbsp;1 times, the array"s
* length will be no greater than <i>n</i>, and the array"s last entry
* will contain all input beyond the last matched delimiter.  If <i>n</i>
* is non-positive then the pattern will be applied as many times as
* possible and the array can have any length.  If <i>n</i> is zero then
* the pattern will be applied as many times as possible, the array can
* have any length, and trailing empty strings will be discarded.

i kod źródłowy dla metody split klasy String.

 public String[] split(String regex, int limit) {
/* fastpath if the regex is a
(1)one-char String and this character is not one of the
RegEx"s meta characters ".$|()[{^?*+\", or
(2)two-char String and the first char is the backslash and
the second is not the ascii digit or ascii letter.
*/
char ch = 0;
if (((regex.value.length == 1 &&
".$|()[{^?*+\".indexOf(ch = regex.charAt(0)) == -1) ||
(regex.length() == 2 &&
regex.charAt(0) == "\" &&
(((ch = regex.charAt(1))-"0")|("9"-ch)) < 0 &&
((ch-"a")|("z"-ch)) < 0 &&
((ch-"A")|("Z"-ch)) < 0)) &&
(ch < Character.MIN_HIGH_SURROGATE ||
ch > Character.MAX_LOW_SURROGATE))
{
int off = 0;
int next = 0;
boolean limited = limit > 0;
ArrayList<String> list = new ArrayList<>();
while ((next = indexOf(ch, off)) != -1) {
if (!limited || list.size() < limit - 1) {
list.add(substring(off, next));
off = next + 1;
} else {    // last one
//assert (list.size() == limit - 1);
list.add(substring(off, value.length));
off = value.length;
break;
}
}
// If no match was found, return this
if (off == 0)
return new String[]{this};

// Add remaining segment
if (!limited || list.size() < limit)
list.add(substring(off, value.length));

// Construct result
int resultSize = list.size();
if (limit == 0)
while (resultSize > 0 && list.get(resultSize - 1).length() == 0)
resultSize--;
String[] result = new String[resultSize];
return list.subList(0, resultSize).toArray(result);
}
return Pattern.compile(regex).split(this, limit);
}

zobacz tę część kodu

            boolean limited = limit > 0;
ArrayList<String> list = new ArrayList<>();
while ((next = indexOf(ch, off)) != -1) {
if (!limited || list.size() < limit - 1) {
list.add(substring(off, next));
off = next + 1;
} else {    // last one
//assert (list.size() == limit - 1);
list.add(substring(off, value.length));
off = value.length;
break;
}
}

wynikowy rozmiar listy będzie limitem atmost.