正規表現を使用して文字列を\n
で分割するJTextArea
でテキストを分割しようとしていますが、これは機能せず、\r\n|\r|n
および他の多くの正規表現の組み合わせでも試してみました。コード:
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");
}
これはあなたをカバーするはずです:
String lines[] = string.split("\\r?\\n");
あなたが心配する必要があるのは本当に2つの改行(UNIXとWindows)だけです。
空行が不要な場合は、
String.split("[\\r\\n]+")
split
メソッドは正規表現(正規表現)を使用しています。 Java 8正規表現は( Patternクラスのドキュメント から)を表す\R
をサポートしていますので:
改行マッチャー
\R任意のUnicode改行シーケンス。\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]
と同等です。
それで我々はそれをマッチするために使うことができます:
\u000D\000A
- > \r\n
ペア\n
)\t
、つまり\u0009
と混同しないでください)\f
)\r
)ご覧のように\r\n
はregexの先頭に置かれ、これはregexが最初にこのpairにマッチしようとすることを確実にし、そしてそのマッチが失敗した場合に限ってsingle character行セパレータにマッチしようとします。
したがって、行区切り文字で分割したい場合はsplit("\\R")
を使用してください。
もしそうなら 結果の配列の末尾に空の文字列を削除したくない場合は""
split(regex, limit)
のように負のlimit
パラメータを付けてsplit("\\R", -1)
を使用してください。
1つ以上の空白行を単一の区切り文字として処理したい場合は、split("\\R+")
を使用します。
String.split(System.getProperty("line.separator"));
これはシステムに依存しない
文字グループの中で二重のエスケープ文字を使う必要はありません。
空でないすべての行に対して、
String.split("[\r\n]+")
多分これはうまくいくでしょう:
Splitメソッドのパラメータから二重円記号を削除します。
split = docStr.split("\n");
Java-11 のlines
クラスに新しいメソッドString
が導入されました。これはStream<String>
を返します。
行末文字で区切られたこの文字列から抽出された部分文字列のストリームを返します。
認識されるラインターミネータは、ラインフィード "\ n"(U + 000A)、キャリッジリターン "\ r"(U + 000D)、そしてキャリッジリターンとそれに続くラインフィード "\ r\n"(U + 000D U + 000A)です。 ).
いくつか例を挙げます。
jshell> "lorem \n ipusm \n sit".lines().forEach(System.out::println)
lorem
ipusm
sit
jshell> "lorem \n ipusm \r sit".lines().forEach(System.out::println)
lorem
ipusm
sit
jshell> "lorem \n ipusm \r\n sit".lines().forEach(System.out::println)
lorem
ipusm
sit
JDK11
では、String
クラスはlines()
メソッドを持ちます。
この文字列から抽出された行のストリームを、行末記号で区切って返します。
さらに、 ドキュメンテーション は次のように言います。
改行文字は、次のいずれかです。改行文字 "\ n"(U + 000A)、復帰文字 "\ r"(U + 000D)、または復帰とそれに続く改行 "\ r\n "(U + 000D U + 000A)です。行は、0個以上の文字のシーケンスとそれに続く行終了文字、または1個以上の文字の後に続くストリングの最後のいずれかです。行には行終了記号は含まれません。
これを使えば簡単にできること:
Stream<String> stream = str.lines();
もしあなたが配列が欲しいなら:
String[] array = str.lines().toArray(String[]::new);
このメソッドがStreamを返すとすると、 concise と並列処理の宣言式を記述できるようになるので、多くの選択肢があります。
ここに与えられたすべての答えは、実際にはJavasの新しい行の定義を尊重しません。 BufferedReader#readline Javaは改行として\n
、\r
および\r\n
を受け入れています。いくつかの答えは複数の空の行または不正な形式のファイルに一致します。例えば。 <sometext>\n\r\n<someothertext>
を使用するときの[\r\n]+
は、2行になります。
String lines[] = string.split("(\r\n|\r|\n)", -1);
これとは対照的に、上記の答えには次のような性質があります。
空行が押しつぶされないようにするには、次のようにします。
String lines[] = String.split("\\r?\\n", -1);
上記のコードは実際には目に見えるものは何もしていません - それは単にcalcualtesしてから計算をダンプします。あなたが使ったコードなのか、それともこの質問のほんの一例なのか。
最後にtextAreaDoc.insertString(int、String、AttributeSet)を試してみますか?
何らかの理由でString.split
を使用したくない場合(例えば 正規表現 のため)、Java 8以降で関数型プログラミングを使用したい場合は、次のようにします。
List<String> lines = new BufferedReader(new StringReader(string))
.lines()
.collect(Collectors.toList());
String lines[] =String.split( System.lineSeparator())
与えられたすべての解決策に基づいて失敗した試みの後。 \n
を特別なWordに置き換えてから分割します。私にとっては、次のようなトリックがありました。
article = "Alice phoned\n bob.";
article = article.replace("\\n", " NEWLINE ");
String sen [] = article.split(" NEWLINE ");
質問の例を再現できませんでした。しかし、私はこの論理が適用できると思います。
これまでの答えに代わるものとして、他の操作が結果の行に適用されることになっている場合、guavaのSplitter
APIを使用することができます。
import com.google.common.base.Splitter;
Iterable<String> split = Splitter.onPattern("\r?\n").trimResults().omitEmptyStrings().split(docStr);
結果は配列ではなくIterable
です。
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");
改行を設定して表示するには、3つの異なる規則(それらが 事実上 標準であると言える)があります。
carriage return
+ line feed
line feed
carriage return
テキストエディタによっては、一方を他方に交換することが可能です。
最も簡単なのはline feed
に正規化してから分割することです。
final String[] lines = contents.replace("\r\n", "\n")
.replace("\r", "\n")
.split("\n", -1);
町には新しい男の子がいるので、上記の複雑さすべてに対処する必要はありません。 JDK 11以降 では、単一行のコードとして記述するだけで済みます。行が分割され、Stream of Stringが返されます。
public class MyClass {
public static void main(String args[]) {
Stream<String> lines="foo \n bar \n baz".lines();
//Do whatever you want to do with lines
}}
いくつかの参考文献。 https://docs.Oracle.com/en/Java/javase/11/docs/api/Java.base/Java/lang/String.html#lines()https://www.azul .com/90新機能とjdk-11のapis / -
これが誰かに役立つことを願っています。ハッピーコーディング.