سؤال

كيف يمكنني استبدال جميع فترات راحة الأسطر من سلسلة في Java بطريقة تعمل على Windows و Linux (على سبيل المثال لا توجد مشاكل محددة لنظام التشغيل لإرجاع/خط خلاصة/خط جديد وما إلى ذلك)؟

لقد جربت (ملاحظة readFileAsString هي وظيفة تقرأ ملف نصي في سلسلة):

String text = readFileAsString("textfile.txt");
text.replace("\n", "");

لكن هذا لا يبدو أنه يعمل.

كيف يمكن القيام بذلك؟

هل كانت مفيدة؟

المحلول

تحتاج إلى ضبط text إلى نتائج text.replace():

String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");

هذا ضروري لأن السلاسل غير قابلة للتغيير - الاتصال replace لا يغير السلسلة الأصلية ، فإنه يعيد إحدى الأنواع الجديدة التي تم تغييرها. إذا لم تقم بتعيين النتيجة text, ، ثم يتم فقدان تلك السلسلة الجديدة وجمع القمامة.

أما بالنسبة للحصول على سلسلة الخط الجديد لأي بيئة - تتوفر عن طريق الاتصال System.getProperty("line.separator").

نصائح أخرى

كما لوحظ في إجابات أخرى ، لا يعمل الكود الخاص بك في المقام الأول لان String.replace(...) لا يغير الهدف String. (لا يمكن - سلاسل جافا غير قابلة للتغيير!) ماذا replace في الواقع هو إنشاء وإعادة جديدة String كائن مع الأحرف تغيرت كما هو مطلوب. لكن الرمز الخاص بك ثم يرمي ذلك String ...


فيما يلي بعض الحلول الممكنة. أي واحد أكثر صحة يعتمد على ما تحاول القيام به بالضبط.

// #1
text = text.replace("\n", "");

ببساطة يزيل جميع الشخصيات الجديدة. هذا لا يتعامل مع إنهاءات خط Windows أو Mac.

// #2
text = text.replace(System.getProperty("line.separator"), "");

يزيل جميع مخططات الخط للمنصة الحالية. هذا لا يتعامل مع الحالة التي تحاول معالجة (على سبيل المثال) ملف UNIX على Windows ، أو العكس.

// #3
text = text.replaceAll("\\r|\\n", "");

يزيل جميع أطراف خط Windows أو UNIX أو MAC. ومع ذلك ، إذا كان ملف الإدخال نصًا ، فسيقوم هذا بتسلق الكلمات ؛ على سبيل المثال

Goodbye cruel
world.

يصبح

Goodbye cruelworld.

لذلك قد ترغب بالفعل في القيام بذلك:

// #4
text = text.replaceAll("\\r\\n|\\r|\\n", " ");

الذي يحل محل كل خطوط المنهي بمساحة. منذ Java 8 يمكنك أيضًا القيام بذلك:

// #5
text = text.replaceAll("\\R", " ");

وإذا كنت ترغب في استبدال فواصل الخطوط المتعددة بمساحة واحدة:

// #6
text = text.replaceAll("\\R+", " ");

إذا كنت ترغب في إزالة محطات الأسطر فقط التي تكون صالحة على نظام التشغيل الحالي ، فيمكنك القيام بذلك:

text = text.replaceAll(System.getProperty("line.separator"), "");

إذا كنت تريد التأكد من إزالة أي فاصل بين الخط ، يمكنك القيام بذلك على هذا النحو:

text = text.replaceAll("\\r|\\n", "");

أو ، أكثر قليلاً مطوئة ، ولكن أقل regexy:

text = text.replaceAll("\\r", "").replaceAll("\\n", "");

هذه الوظيفة تطبيع جميع المساحة البيضاء ، بما في ذلك فواصل الخط ، إلى مساحات واحدة. ليس بالضبط ما طرح السؤال الأصلي ، ولكن من المحتمل أن يفعل بالضبط ما هو مطلوب في كثير من الحالات:

import org.apache.commons.lang3.StringUtils;

final String cleansedString = StringUtils.normalizeSpace(rawString);
str = str.replaceAll("\\r\\n|\\r|\\n", " ");

عملت بشكل مثالي بالنسبة لي بعد البحث كثيرًا ، بعد أن فشلت مع كل خط آخر.

هذا سيكون فعالا على ما أعتقد

String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")

تم تحريره لتمييز بناء الجملة

LineBreaks ليست هي نفسها تحت Windows/Linux/Mac. يجب أن تستخدم System.getProperties مع سطر السمة.

String text = readFileAsString("textfile.txt").replace("\n","");

.replace تُرجع سلسلة جديدة ، والأوتار في Java غير قابلة للتغيير.

قد ترغب في قراءة ملفك باستخدام BufferedReader. يمكن لهذه الفئة تقسيم المدخلات إلى خطوط فردية ، والتي يمكنك تجميعها في الإرادة. الطريقة BufferedReader يتعرف Proates على اتفاقيات نهاية Linux و Windows و MacOS تلقائيًا ، بغض النظر عن النظام الأساسي الحالي.

لذلك:

BufferedReader br = new BufferedReader(
    new InputStreamReader("textfile.txt"));
StringBuilder sb = new StringBuilder();
for (;;) {
    String line = br.readLine();
    if (line == null)
        break;
    sb.append(line);
    sb.append(' ');   // SEE BELOW
}
String text = sb.toString();

لاحظ أن readLine() لا يشمل المنهي الخط في السلسلة التي تم إرجاعها. يرسل الرمز أعلاه مساحة لتجنب اللصق معًا الكلمة الأخيرة من السطر والكلمة الأولى من السطر التالي.

String text = readFileAsString("textfile.txt").replaceAll("\n", "");

على الرغم من أن تعريف TRIM () في موقع Oracle هو "إرجاع نسخة من السلسلة ، مع حذف المسافة البيضاء الرائدة والمتزايدة."

تغادر الوثائق أن تقول أنه سيتم أيضًا إزالة شخصيات الخطوط الجديدة (الرائدة والخليفة).

بالمختصرString text = readFileAsString("textfile.txt").trim(); سيعمل أيضًا من أجلك. (تم فحصه مع Java 6)

أجد أنه من الغريب أن (أباتشي) StringUtils لم يتم تغطيته هنا بعد.

يمكنك إزالة جميع الخطوط الجديدة (أو أي حالات أخرى من فرعية لهذه المسألة) من سلسلة باستخدام .replace طريقة

StringUtils.replace(myString, "\n", "");

سيحل هذا الخط محل جميع الخطوط الجديدة بالسلسلة الفارغة.

لأن Newline من الناحية الفنية شخصية يمكنك استخدامها اختياريًا .replaceChars الطريقة التي ستحل محل الأحرف

StringUtils.replaceChars(myString, '\n', '');

لمعلوماتك إذا كنت ترغب في استبدال قطع الخط المتزامن في وقت واحد مع فاصل خط واحد ، فيمكنك الاستخدام

myString.trim().replaceAll("[\n]{2,}", "\n")

أو استبدل بمساحة واحدة

myString.trim().replaceAll("[\n]{2,}", " ")

يمكنك استخدام Apache Commons Ioutils للتكرار من خلال الخط وإلحاق كل سطر إلى StringBuilder. ولا تنس إغلاق inputstream

StringBuilder sb = new StringBuilder();
FileInputStream fin=new FileInputStream("textfile.txt");
LineIterator lt=IOUtils.lineIterator(fin, "utf-8");
while(lt.hasNext())
{
  sb.append(lt.nextLine());
}
String text = sb.toString();
IOUtils.closeQuitely(fin);

يمكنك استخدام طرق عامة لاستبدال أي Char بأي Char.

public static void removeWithAnyChar(String str, char replceChar,
        char replaceWith) {
    char chrs[] = str.toCharArray();
    int i = 0;
    while (i < chrs.length) {

        if (chrs[i] == replceChar) {
            chrs[i] = replaceWith;
        }
        i++;
    }

}

org.apache.commons.lang.StringUtils#ChopNewline

حاول القيام بذلك:

 textValue= textValue.replaceAll("\n", "");
 textValue= textValue.replaceAll("\t", "");
 textValue= textValue.replaceAll("\\n", "");
 textValue= textValue.replaceAll("\\t", "");
 textValue= textValue.replaceAll("\r", "");
 textValue= textValue.replaceAll("\\r", "");
 textValue= textValue.replaceAll("\r\n", "");
 textValue= textValue.replaceAll("\\r\\n", "");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top