Próbuję podzielić tekst za JTextArea
pomocą wyrażenia regularnego, aby podzielić ciąg według. \n
Jednak to nie działa, a także próbowałem przez \r\n|\r|n
i wiele innych kombinacji wyrażeń regularnych. Kod:
public void insertUpdate(DocumentEvent e) {
String split[], docStr = null;
Document textAreaDoc = (Document)e.getDocument();
try {
docStr = textAreaDoc.getText(textAreaDoc.getStartPosition().getOffset(), textAreaDoc.getEndPosition().getOffset());
} catch (BadLocationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
split = docStr.split("\\n");
}
Odpowiedzi:
Powinno to obejmować:
Tak naprawdę są tylko dwie nowe linie (UNIX i Windows), o które musisz się martwić.
źródło
split
domyślnie usuwa końcowe ciągi znaków, jeśli zawierają wynik podziału. Aby wyłączyć ten mechanizm, musisz użyć przeciążonej wersjisplit(regex, limit)
z ujemnym limitem jaktext.split("\\r?\\n", -1)
. Więcej informacji: Podział łańcucha Java usunął puste wartościString#split(String regex)
Metoda używa wyrażeń regularnych (wyrażeń regularnych). Ponieważ regex Java 8 obsługuje to,\R
co reprezentuje (z dokumentacji klasy Pattern ):Możemy więc użyć go do dopasowania:
\u000D\000A
->\r\n
para\n
)\t
która jest\u0009
)\f
)\r
)Jak widać,
\r\n
umieszczany jest na początku wyrażenia regularnego, co zapewnia, że wyrażenie regularne spróbuje najpierw dopasować tę parę , i tylko jeśli to dopasowanie się nie powiedzie, spróbuje dopasować separatory pojedynczych znaków .Więc jeśli chcesz podzielić separator liniowy, użyj
split("\\R")
.Jeśli nie chcesz usuwać z wynikowej tablicy pustych ciągów znaków,
""
użyj parametrusplit(regex, limit)
ujemnegolimit
, takiego jaksplit("\\R", -1)
.Jeśli chcesz traktować jedną lub więcej kontynuuj puste linie jako pojedynczy separator
split("\\R+")
.źródło
\\R+
, aby uniknąć znaków końca linii, które nie byłyby objęte\\R
osobno.Jeśli nie chcesz pustych linii:
źródło
Powinno to być niezależne od systemu
źródło
lines
DoString
klasy wprowadzono nową metodęjava-11, która zwracaStream<String>
Oto kilka przykładów:
Ciąg # linii ()
źródło
Nie musisz podwójnie uciekać postaci w grupach postaci.
Dla wszystkich niepustych linii użyj:
źródło
\r
i\n
mogą mieć jeden lub dwa odwrotne ukośniki; działają tak czy inaczej.'\\'
w kodzie staje się'\'
znakiem, a następnie jest przekazywany do silnika RegEx, więc"[\\r\\n]"
kod zostaje[\r\n]
w pamięci i RegEx to przetworzy. Nie wiem, jak dokładnie Java obsługuje RegEx, ale dobrą praktyką jest przekazywanie „czystego” wzorca łańcucha ASCII do silnika RegEx i pozwalanie mu przetwarzać, zamiast przekazywać znaki binarne."[\r\n]"
staje się (szesnastkowy)0D0A
w pamięci i jeden silnik RegEx może go zaakceptować, podczas gdy inny będzie się dusić. WięcW
JDK11
tejString
klasie malines()
metodę:Ponadto dokumentacja mówi dalej:
Dzięki temu można po prostu:
to jeśli chcesz tablicę:
Biorąc pod uwagę, że ta metoda zwraca strumień, pojawia się wiele opcji, ponieważ umożliwia napisanie zwięzłego i deklaratywnego wyrażenia możliwych równoległych operacji.
źródło
Może to zadziała:
Usuń podwójne ukośniki odwrotne z parametru metody podziału:
źródło
Wszystkie podane tutaj odpowiedzi faktycznie nie są zgodne z definicją nowych wierszy w języku JavaScript, jak podano np. W BufferedReader # readline. Java jest przyjęcie
\n
,\r
a\r\n
jako nowej linii. Niektóre odpowiedzi pasują do wielu pustych linii lub zniekształconych plików. Na przykład.<sometext>\n\r\n<someothertext>
przy użyciu[\r\n]+
spowoduje dwa wiersze.Natomiast powyższa odpowiedź ma następujące właściwości:
źródło
Jeśli z jakiegoś powodu nie chcesz używać
String.split
(na przykład z powodu wyrażeń regularnych ) i chcesz używać programowania funkcjonalnego w Javie 8 lub nowszej:źródło
String[] lines = new BufferedReader(...).lines().toArray(String[]::new);
dla tablicy zamiast listy. Zaletą tego rozwiązania jest to, żeBufferedReader
wie o wszelkiego rodzaju podobnych terminatorach, dzięki czemu może obsługiwać tekst we wszystkich formatach. (Większość opublikowanych tutaj rozwiązań opartych na wyrażeniach regularnych jest pod tym względem niewystarczająca.)Aby uchronić puste linie przed zgnieceniem, użyj:
źródło
Powyższy kod nie robi nic widocznego - po prostu calcualtes, a następnie zrzuca obliczenia. Czy to kod, którego użyłeś, czy tylko przykład tego pytania?
spróbować zrobić textAreaDoc.insertString (int, String, AttributeSet) na końcu?
źródło
Alternatywnie do poprzednich odpowiedzi
Splitter
można użyć interfejsu API guava, jeśli do linii wynikowych mają zostać zastosowane inne operacje, takie jak przycinanie linii lub filtrowanie pustych linii:Zauważ, że wynikiem jest
Iterable
tablica, a nie tablica.źródło
String lines[] =String.split( System.lineSeparator())
źródło
Po nieudanych próbach na podstawie wszystkich podanych rozwiązań. Wymieniam
\n
specjalne słowo, a następnie dzielę. Dla mnie następowała sztuczka:Nie mogłem powtórzyć przykładu podanego w pytaniu. Ale myślę, że tę logikę można zastosować.
źródło
Powyższe odpowiedzi nie pomogły mi na Androidzie, dzięki odpowiedzi Pshemo, która działała dla mnie na Androidzie. Pozostawię tutaj odpowiedź Pshemo :
źródło
źródło
Istnieją trzy różne konwencje (można powiedzieć, że są to de facto standardy) do ustawiania i wyświetlania podziału linii:
carriage return
+line feed
line feed
carriage return
W niektórych edytorach tekstu można wymienić jeden na drugi:
Najprostszą rzeczą jest normalizacja,
line feed
a następnie podział.źródło
W mieście jest nowy chłopiec, więc nie musisz zajmować się wszystkimi powyższymi złożonościami. Począwszy od JDK 11 , wystarczy pisać jako pojedynczy wiersz kodu, dzieli linie i zwraca Strumień ciągu.
Niektóre referencje. https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#lines () https://www.azul.com/90-new -features-and-apis-in-jdk-11 /
Mam nadzieję, że to będzie komuś pomocne. Szczęśliwego kodowania.
źródło
źródło