تقسيم سلسلة جافا بواسطة خط جديد
سؤال
أحاول تقسيم النص في ملف JTextArea
باستخدام regex لتقسيم السلسلة حسب \n
ومع ذلك، هذا لا يعمل وأنا حاولت أيضا \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");
وهناك في الواقع سوى اثنين أسطر جديدة (UNIX و Windows) التي تحتاج للقلق.
نصائح أخرى
إذا كنت لا تريد خطوط فارغة:
String.split("[\\r\\n]+")
split
الطريقة تستخدم regex (التعبيرات العادية).منذ أن يدعم Java 8 regex \R
والذي يمثل (من توثيق فئة النمط):
مُطابق فاصل الخط
أي تسلسل لفاصل أسطر Unicode، يعادل\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]
لذلك يمكننا استخدامه للمطابقة:
\u000D\000A
->\r\n
زوج- \u000أ -> تغذية السطر (
\n
) - \u000ب -> جدولة الأسطر (لا تخلط مع جدولة الأحرف
\t
الذي\u0009
) - \u000C -> تغذية النموذج (
\f
) - \u000د -> إرجاع النقل (
\r
) - \u0085 -> السطر التالي (نيل)
- \u2028 -> فاصل الأسطر
- \u2029 -> فاصل الفقرة
كما ترى \r\n
يتم وضعه في بداية التعبير العادي مما يضمن أن التعبير العادي سيحاول مطابقة ذلك زوج أولاً، وفقط في حالة فشل تلك المطابقة، ستحاول المطابقة حرف واحد فواصل الخط.
لذلك إذا كنت تريد التقسيم على فاصل الخط، فاستخدمه split("\\R")
.
اذا أنت لا تريد الإزالة من المصفوفة الناتجة التي تتبع سلاسل فارغة ""
يستخدم split(regex, limit)
مع السلبية limit
المعلمة مثل split("\\R", -1)
.
إذا كنت تريد التعامل مع واحد أو أكثر من الأسطر الفارغة المستمرة كاستخدام محدد واحد split("\\R+")
.
String.split(System.getProperty("line.separator"));
وهذا يجب أن يكون نظام مستقل
وليس لديك لمضاعفة الهروب الأحرف في مجموعات شخصية.
لجميع خطوط غير فارغة استخدام:
String.split("[\r\n]+")
وربما هذا من شأنه العمل:
وإزالة خطوط مائلة عكسية مزدوجة من المعلمة من طريقة تقسيم:
split = docStr.split("\n");
تم استحداث طريقة lines
جديدة لString
فئة في <فئة = "ما بعد سمة" أ href = "/ الأسئلة / المعلمة / جافا-11" عنوان = "عرض الأسئلة الموسومة" جافا-11 "يختلط =" سمة "> جافا-11 ، والتي ترجع Stream<String>
وإرجاع تيار فرعية المستخرجة من هذه السلسلة تقسيم قبل الإنهاء الخط.
والإنهاء الخط المعترف بها تغذية خط "\ ن" (U + 000A)، والنقل عودة "\ ص" (U + 000D) وإرجاع جاءت على الفور من قبل سطر تغذية "\ ص \ ن" (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
<وأ href = "https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#lines ()" يختلط = "نوفولو noreferrer "> سلسلة # خطوط ()
جميع الإجابات المقدمة هنا في الواقع لا تحترم تعريف Java للخطوط الجديدة كما هو موضح في على سبيل المثال.BufferedReader#readline.جافا تقبل \n
, \r
و \r\n
كخط جديد.تتطابق بعض الإجابات مع عدة أسطر فارغة أو ملفات مشوهة.على سبيل المثال. <sometext>\n\r\n<someothertext>
عند الاستخدام [\r\n]+
سيؤدي إلى سطرين.
String lines[] = string.split("(\r\n|\r|\n)", -1);
وفي المقابل، فإن الإجابة أعلاه لها الخصائص التالية:
- إنه يتوافق مع تعريف Java لخط جديد مثل على سبيل المثال.يستخدمه BufferedReader
- ولا يتطابق مع عدة أسطر جديدة
- ولا يقوم بإزالة الأسطر الفارغة الزائدة
في JDK11
الطبقة String
لديها طريقة lines()
:
وإرجاع التيار من خطوط المستخرجة من هذه السلسلة، مفصولة الإنهاء الخط.
اقتباس فقرة>وعلاوة على ذلك، في وثائق غني عن القول:
<اقتباس فقرة>وهناك فاصل خط واحد مما يلي: سطر تغذية أحرف "\ ن" (U + 000A)، وهو حرف الإرجاع "\ ص" (U + 000D)، أو عربة وجاءت عودة على الفور من قبل سطر تغذية "\ ص \ ن" (U + 000D U + 000A). أ الخط هو إما سلسلة من الصفر أحرف أو أكثر تليها خط فاصل، أو أنه هو سلسلة من حرف واحد أو أكثر تليها نهاية السلسلة. لا يتضمن خط الخط فاصل.
اقتباس فقرة>ومع هذا يمكن للمرء ببساطة القيام به:
Stream<String> stream = str.lines();
وبعد ذلك إذا كنت تريد صفيف:
String[] array = str.lines().toArray(String[]::new);
ونظرا لهذا الأسلوب بإرجاع ستريم هو على ما يصل الكثير من الخيارات بالنسبة لك لأنها تمكن واحد لكتابة <م> موجزة م> والتعبير التعريفي العمليات ربما متوازية.
لحفظ خطوط فارغة من الحصول على استخدام سحق:
String lines[] = String.split("\\r?\\n", -1);
ودوسنت كود أعلاه في الواقع تفعل أي شيء مرئية - أنها مجرد calcualtes ثم مقالب حساب. هو الرمز الذي يستخدم، أو مجرد مثال لهذا السؤال؟
ومحاولة القيام textAreaDoc.insertString (كثافة العمليات، سلسلة، AttributeSet) في نهاية؟
إذا، لسبب ما، كنت لا تريد استخدام String.split
(على سبيل المثال، بسبب <لأ href = "http://regex.info/blog/2006-09-15/247" يختلط = "نوفولو noreferrer "> التعابير العادية )، وكنت ترغب في استخدام البرمجة الوظيفية في جاوا 8 أو أحدث:
List<String> lines = new BufferedReader(new StringReader(string))
.lines()
.collect(Collectors.toList());
وString lines[] =String.split( System.lineSeparator())
وبعد محاولات فاشلة على أساس كل الحلول معين. I استبدال \n
مع بعض الكلمات الخاصة ومن ثم الانقسام. بالنسبة لي لم التالية خدعة:
article = "Alice phoned\n bob.";
article = article.replace("\\n", " NEWLINE ");
String sen [] = article.split(" NEWLINE ");
وأنا لا يمكن أن تكرار المثال المذكور في السؤال. ولكن، أعتقد أن هذا المنطق يمكن تطبيقه.
وكبديل لالأجوبة السابقة، API Splitter
الجوافة ويمكن استخدامها اذا العمليات الأخرى ليتم تطبيقها على الخطوط الناتجة عن ذلك، مثل تقليم خطوط أو تصفية خطوط فارغة:
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");
هناك ثلاث اتفاقيات مختلفة (يمكن القول أن هذه هي بحكم الأمر الواقع المعايير) لتعيين وعرض فاصل الأسطر:
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 فصاعدا, ، كل ما عليك فعله هو الكتابة كسطر واحد من التعليمات البرمجية، وسوف يقسم الأسطر ويعيد لك دفق السلسلة.
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-new-features-and-apis-in-jdk-11/
آمل أن يكون هذا مفيدًا لشخص ما.ترميز سعيد.
وقال إن الإجابات أعلاه لا يساعدني على الروبوت، وذلك بفضل Pshemo الاستجابة التي عملت بالنسبة لي على الروبوت. سأترك بعض الجواب Pshemo في هنا:
split("\\\\n")
package in.javadomain;
public class JavaSplit {
public static void main(String[] args) {
String input = "chennai\nvellore\ncoimbatore\nbangalore\narcot";
System.out.println("Before split:\n");
System.out.println(input);
String[] inputSplitNewLine = input.split("\\n");
System.out.println("\n After split:\n");
for(int i=0; i<inputSplitNewLine.length; i++){
System.out.println(inputSplitNewLine[i]);
}
}
}