سؤال

أحاول تقسيم النص في ملف 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]

لذلك يمكننا استخدامه للمطابقة:

كما ترى \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

في بعض برامج تحرير النصوص، من الممكن استبدال أحدهما بالآخر:

Notepad++

أبسط شيء هو التطبيع 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]);
        }
    }

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top