নতুন লাইনে জাভা স্ট্রিং বিভক্ত করুন


388

আমি JTextAreaস্ট্রিং দ্বারা স্ট্রিং বিভক্ত করার জন্য একটি রেইজেক্স ব্যবহার করে পাঠ্যকে বিভক্ত করার চেষ্টা করছি \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");
}

7
আপনি কি ত্রুটি পেতে পারি? "কাজ করে না" বলবেন না, এর অর্থ কিছুই নয়। আপনি যে ত্রুটি / ফলাফল পেয়েছেন তা আমাদের জানান। এটি ডিবাগিং কোডের প্রথম পদক্ষেপ - ভুল ফলাফল কী এবং কীভাবে আপনার প্রোগ্রামটি এটি পেয়েছিল তা নির্ধারণ করুন।
চিই

আপনি কি সত্যিই করতে চান? - JTextArea তে প্রবেশের সাথে সাথে লাইনগুলি ভাঙ্গতে হবে? - জে টেক্সটরিয়া কোথায় লাইন মোড়ক করছে তা সন্ধান করছেন? - ???
ব্যবহারকারী 85421

উত্তর:


731

এটি আপনাকে আবরণ করা উচিত:

String lines[] = string.split("\\r?\\n");

কেবলমাত্র দুটি নিউলাইন রয়েছে (ইউনিক্স এবং উইন্ডোজ) যার জন্য আপনার চিন্তার দরকার।


43
একটি JTextArea ডকুমেন্ট কেবল '\ n' ব্যবহার করা উচিত; এর ভিউগুলি '' r 'কে সম্পূর্ণ উপেক্ষা করে। তবে আপনি যদি একাধিক ধরণের বিভাজকের সন্ধান করতে চলেছেন তবে আপনি তিনটিই খুঁজে পেতে পারেন: "? R? \ N | \ r"।
অ্যালান মুর

10
ম্যাক 9 ব্যবহার করে। আর। ওএসএক্স 10 \ n ব্যবহার করে
রাইকি

$ {fn: দৈর্ঘ্য (fn: split (ডেটা, '? r? \\ n')) j jstl এ কাজ করছে না

4
@ আনতাক হ্যাঁ, splitডিফল্টরূপে খালি স্ট্রিংগুলি বিভক্ত হওয়ার ফলে তারা পেছনে পেছনে সরিয়ে দেয়। এই প্রক্রিয়াটি বন্ধ করতে আপনার split(regex, limit)যেমন নেতিবাচক সীমা রয়েছে তার ওভারলোড হওয়া সংস্করণ ব্যবহার করতে হবে text.split("\\r?\\n", -1)। আরও তথ্য: জাভা স্ট্রিং বিভক্ত খালি মানগুলি
সরিয়েছে

1
@ স্টিভ্লোর মন্তব্যটি ভুল তথ্য, এবং দুর্ভাগ্যজনক যে এটির এতগুলি উত্সাহ রয়েছে। @ রাইকি যেমন উল্লেখ করেছেন, ২০০১ সালে প্রকাশিত হওয়ার পর থেকে ওএস এক্স (বর্তমানে ম্যাকোস হিসাবে পরিচিত) তার লাইন বিভাজক হিসাবে \ n ব্যবহার করেছে Mac ম্যাক ওএস ৯৯৯৯ সালে প্রকাশিত হয়েছিল, এবং আমি কোনও ম্যাক ওএস ৯ বা তার নিচে মেশিন ব্যবহার করতে দেখিনি never উৎপাদন. একটি একক আধুনিক অপারেটিং সিস্টেম নেই যা লাইন বিভাজক হিসাবে uses r ব্যবহার করে। কখনো লিখতে যে কোডটি আশা পান \ r Mac এ লাইন বিভাজক হবে, যদি না ক) আপনি, বিপরীতমুখী কম্পিউটিং করছেন সেটি খ) একটি অপারেটিং সিস্টেম 9 মেশিন আপ কর্তিত আছে, এবং গ) নির্ভরযোগ্যভাবে নির্ধারণ করতে পারে মেশিন আসলে ওএস 9. হয়
জেমস

132

String#split​(String regex)পদ্ধতিটি রেগেক্স ব্যবহার করছে (নিয়মিত প্রকাশ)। যেহেতু জাভা 8 রেজেক্স সমর্থন করে \Rযা প্রতিনিধিত্ব করে ( প্যাটার্ন শ্রেণির নথি থেকে ):

লাইনব্রেক ম্যাচার
\ আর যেকোন ইউনিকোড লাইনব্রেক ক্রম, এর সমান \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]

সুতরাং আমরা এটি মেলে ব্যবহার করতে পারি:

যেমনটি আপনি দেখতে পেয়েছেন \r\nরেইগেক্সের শুরুতে রয়েছে যা নিশ্চিত করে যে রেজেক্স প্রথমে এই জুটির সাথে মেলে চেষ্টা করবে এবং কেবল যদি সেই ম্যাচটি ব্যর্থ হয় তবে এটি একক চরিত্রের রেখার বিভাজককে মিলানোর চেষ্টা করবে ।


সুতরাং আপনি লাইন বিভাজক ব্যবহার বিভক্ত করতে চান split("\\R")

আপনি যদি ফলাফলের অ্যারে অনুসরণ করে খালি স্ট্রিংগুলি""split(regex, limit) নেতিবাচক limitপ্যারামিটারের মতো ব্যবহার করে সরিয়ে নিতে চান নাsplit("\\R", -1)

আপনি যদি এক বা একাধিক অবিরত খালি লাইনগুলিকে একক ডিলিমিটার ব্যবহার হিসাবে চিকিত্সা করতে চান split("\\R+")


4
হ্যাঁ, এটি সেরা উত্তর দুর্ভাগ্যজনক যে এই উত্তরটির জন্য প্রশ্নটি খুব ছয় বছর আগে জিজ্ঞাসা করা হয়েছিল।
দাউদ ইবনে কেরেম

একা \\R+আচ্ছাদন করা হয়নি এমন কোনও শেষ-অব-লাইন অক্ষর এড়ানোর জন্য আমি বিভক্ত হয়ে গিয়েছিলাম \\R
তাত্পর্যপূর্ণ

128

আপনি যদি খালি লাইনগুলি না চান:

String.split("[\\r\\n]+")

4
ডাবল ব্যাকস্ল্যাশগুলি অপ্রয়োজনীয়, "ব্যাকস্ল্যাশগুলি, পলায়ন, এবং উদ্ধৃতি" বিভাগটি দেখুন
javase/


1
উপরের উত্তরটি না দিলে এটি ম্যাক ওএসএক্স-এ কাজ করেছিল।
জন

এটি আমার জন্যও কাজ করেছিল। দুর্দান্ত সমাধান। এটি নিম্নলিখিত 2 টি মামলার জন্য কাজ করেছে: 1) আমি 3 ঘন্টা ঘড়িতে জেগেছি \ r \ n \ r \ n আমি আশা করি 2) এটিই বাস্তব জীবন \ r \ nso I
লোগিক্সপ্লেয়ার

2
@ ট্রেসফ আপনি বর্গাকার বন্ধনীগুলিতে কোয়ান্টিফায়ার ব্যবহার করতে পারবেন না।
সিএক্স গেমার

49
String.split(System.getProperty("line.separator"));

এটি সিস্টেম স্বাধীন হতে হবে


41
এটি একটি আকর্ষণীয় ধারণা, তবে আপনার যত্ন নেওয়া উচিত যে পাঠ্যটি আসলে সিস্টেমের লাইন বিভাজকটি ব্যবহার করে। আমি ইউনিক্সের অধীনে অনেকগুলি টেক্সট ফাইল ভাল করেছি (যেমন এক্সএমএল) যা "উইন্ডোজ" বিভাজক এবং উইন্ডোজের অধীনে ইউনিক্স বিভাজক ব্যবহার করে uses
মার্টেন বোদেউয়েস

এমনকি অ্যান্ড্রয়েডেও কাজ করে
13

6
উইন্ডোজ ওএসে তৈরি হওয়া ফাইল এবং ইউনিক্স ওএসে স্থানান্তরিত ফাইলগুলিতে এখনও \ r \ n পৃথককারী থাকবে। আমি মনে করি নিরাপদ খেলা এবং উভয় পৃথককে অ্যাকাউন্টে নেওয়া ভাল।
বিভিডিবি

17
এটি একটি খুব সমস্যাযুক্ত পদ্ধতির! ফাইলটি কোড চালিত সিস্টেম থেকে উদ্ভূত নাও হতে পারে। আমি এই ধরণের "সিস্টেম স্বাধীন" ডিজাইনগুলিকে দৃ strongly়ভাবে নিরুৎসাহিত করি যা আসলে কোনও নির্দিষ্ট সিস্টেম, রানটাইম সিস্টেমের উপর নির্ভর করে।
মার্টিন

4
@ শেরভিন এটি করার সর্বোত্তম উপায় কখনও নয়। এটি আসলে খুব খারাপ অনুশীলন। সিস্টেম.সেটপ্রোপার্টি কলকারী কিছু অন্যান্য প্রোগ্রামার বিবেচনা করুন ("line.separator", "আপনার কোনও লাভ নেই"); আপনার কোডটি নষ্ট হয়ে গেছে। এমনকি আপনার নির্ভরতা সম্পর্কে কোনও জ্ঞান না থাকলে এটি নির্ভর করে একইভাবে বলা যেতে পারে।
মার্টিন

14

ক্লাস ইন নতুন পদ্ধতি linesচালু করা হয়েছেString, যা ফিরে আসে Stream<String>

লাইন টার্মিনেটর দ্বারা বিভাজনিত এই স্ট্রিং থেকে উত্তোলিত সাবস্ট্রিংগুলির একটি স্ট্রিম ফেরত দেয়।

স্বীকৃত লাইন টার্মিনেটরগুলি হ'ল লাইন ফিড "\ n" (ইউ + 000 এ), ক্যারেজ রিটার্ন "\ আর" (ইউ + 000 ডি) এবং একটি ক্যারেজ রিটার্নের সাথে সাথেই একটি লাইন ফিড "\ 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

স্ট্রিং টি লাইন ()


12

চরিত্রের গ্রুপগুলিতে আপনাকে পালাতে অক্ষর দ্বিগুণ করতে হবে না।

সমস্ত অ খালি লাইনের জন্য ব্যবহার করুন:

String.split("[\r\n]+")

হ্যাঁ তুমি কর. তাদের যদি কোথাও ডাবল-পালানোর প্রয়োজন হয় তবে তাদের সর্বত্র এটি প্রয়োজন। হোয়াইটস্পেসের মতো পালিয়ে যায় \rএবং \nএক বা দুটি ব্যাকস্ল্যাশ থাকতে পারে; তারা যেভাবেই কাজ করে।
অ্যালান মুর

2
'\\'কোডে ডাবল ব্যাকস্ল্যাশ একটি '\'অক্ষর হয়ে যায় এবং তারপরে RegEx ইঞ্জিনে পাস করা হয়, সুতরাং কোডটিতে মেমরি "[\\r\\n]"হয়ে যায় [\r\n]এবং RegEx এটি প্রক্রিয়া করবে। আমি জানি না কীভাবে জাভা RegEx পরিচালনা করে, তবে RegEx ইঞ্জিনে "খাঁটি" ASCII স্ট্রিং প্যাটার্নটি পাস করা এবং বাইনারি অক্ষরগুলি পাস করার পরিবর্তে এটি প্রক্রিয়া করতে দেওয়া একটি ভাল অনুশীলন। স্মৃতিতে "[\r\n]"(হেক্স) হয়ে যায় 0D0Aএবং একটি রেজেক্সেক্স ইঞ্জিন এটি গ্রহণ করতে পারে অন্যদিকে শ্বাসরোধ করবে। সুতরাং নীচের লাইনটি হ'ল জাভা এর RegEx এর স্বাদ তাদের প্রয়োজন না
হলেও

10

ইন বর্গ টি পদ্ধতি:JDK11Stringlines()

লাইন টার্মিনেটরগুলি দ্বারা পৃথক করে, এই স্ট্রিং থেকে উত্তোলিত রেখার স্রোত ফিরিয়ে দেওয়া।

আরও, ডকুমেন্টেশনটি বলতে থাকে:

একটি লাইন টার্মিনেটর নিম্নলিখিতগুলির মধ্যে একটি: একটি লাইন ফিড অক্ষর "\ n" (U + 000A), একটি ক্যারেজ রিটার্ন অক্ষর "\ r" (U + 000D), বা ক্যারিজ ফেরত সাথে সাথে একটি লাইন ফিড অনুসরণ করে "\ r । n "(U + 000D U + 000A)। একটি লাইন হয় লাইন টার্মিনেটরের পরে শূন্য বা আরও বেশি অক্ষরের অনুক্রম হয় বা স্ট্রিংয়ের শেষে এটি এক বা একাধিক অক্ষরের ক্রম হয়। একটি লাইনে লাইন টার্মিনেটর অন্তর্ভুক্ত নয়।

এটির সাহায্যে একটি সহজভাবে করতে পারেন:

Stream<String> stream = str.lines();

তাহলে আপনি যদি একটি অ্যারে চান:

String[] array = str.lines().toArray(String[]::new);

এই পদ্ধতিটি প্রদত্ত একটি স্ট্রিমটি আপনার পক্ষে প্রচুর বিকল্পের উপরে তুলে ধরে কারণ এটি একজনকে সম্ভাব্য-সমান্তরাল ক্রিয়াকলাপের সংক্ষিপ্ত এবং ঘোষণাপত্র প্রকাশ করতে সক্ষম করে।


7

সম্ভবত এটি কাজ করবে:

বিভক্ত পদ্ধতির প্যারামিটার থেকে ডাবল ব্যাকস্ল্যাশগুলি সরান:

split = docStr.split("\n");

8
আসলে তা না. যখন আপনি একটি জাভা স্ট্রিং আক্ষরিক আকারে একটি রেজেক্স লিখেন, আপনি রেজেক্স সংকলকটিকে একটি লাইনফিড প্রতীকটি পাস করতে "\ n" ব্যবহার করতে পারেন, বা "fe n" এটি লাইনফিডের জন্য অব্যাহতি ক্রমটি পাস করতে পারেন। Java v ব্যতীত অন্যান্য সমস্ত শ্বেত স্পেস পলায়নের ক্ষেত্রে একই রকম হয় যা জাভা লিটারালগুলিতে সমর্থিত নয়।
অ্যালান মুর

3
@Yuval। দুঃখিত, এটি ভুল, আপনার " বাক্সল্যাশ
javase/

7

এখানে প্রদত্ত সমস্ত উত্তরগুলি উদাহরণস্বরূপ বাফারড্রেডার # রিডলাইন হিসাবে দেওয়া নতুন লাইনের জাভাস সংজ্ঞাটিকে সম্মান করে না। জাভা গ্রহণ করছে \n, \rএবং \r\nনতুন লাইন হিসাবে। কিছু উত্তর একাধিক খালি লাইন বা ত্রুটিযুক্ত ফাইলের সাথে মেলে। E..g। <sometext>\n\r\n<someothertext>যখন ব্যবহার করার [\r\n]+ফলে দুটি লাইন হয়।

String lines[] = string.split("(\r\n|\r|\n)", -1);

বিপরীতে, উপরের উত্তরের নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

  • এটি জাভাস সংজ্ঞাটি একটি নতুন লাইনের সংজ্ঞা যেমন: যেমন বাফার্ডার্ডার এটি ব্যবহার করছে তার সাথে সম্মতি দেয়
  • এটি একাধিক নতুন লাইনের সাথে মেলে না
  • এটি খালি লাইনগুলি অনুসরণ করে না

6

যদি কোনও কারণে আপনি ব্যবহার করতে না চান String.split(উদাহরণস্বরূপ, নিয়মিত প্রকাশের কারণে ) এবং আপনি জাভা 8 বা আরও নতুনতে ফাংশনাল প্রোগ্রামিং ব্যবহার করতে চান:

List<String> lines = new BufferedReader(new StringReader(string))
        .lines()
        .collect(Collectors.toList());

আমি জানি এটি একটি ওভারকিল সমাধান হতে পারে।
ড্যানিলো পিয়াজলুঙ্গা

3
বা String[] lines = new BufferedReader(...).lines().toArray(String[]::new);তালিকার পরিবর্তে অ্যারের জন্য। এই সমাধানটি সম্পর্কে দুর্দান্ত জিনিসটি হ'ল BufferedReaderসকল ধরণের টার্মিনেটর সম্পর্কে জানে তাই এটি সকল ধরণের বিন্যাসে পাঠ্য পরিচালনা করতে পারে। (এখানে পোস্ট করা বেশিরভাগ রেইগেক্স-ভিত্তিক সমাধানগুলি এ ক্ষেত্রে সংক্ষেপে পড়ে))
টেড হপ্প

2
এই সমাধানটি জাভা 11 এবং স্ট্রিং.লাইনস () পদ্ধতি প্রবর্তনের পর থেকে অচল।
লেভেন্টভ

4

স্কোয়াশেড ব্যবহার থেকে খালি লাইন সংরক্ষণের জন্য:

String lines[] = String.split("\\r?\\n", -1);

3

উপরের কোডটি বাস্তবে দৃশ্যমান কিছু করতে পারে না - এটি কেবল গণনা করে তারপর গণনাটি ডাম্প করে। এটি আপনার ব্যবহৃত কোড, বা এই প্রশ্নের জন্য একটি উদাহরণ?

শেষে TextAreaDoc.insertString (int, স্ট্রিং, অ্যাট্রিবিউটসেট) করার চেষ্টা করবেন?


insertUpdate () একটি ডকুমেন্টলিস্টনার পদ্ধতি ten ধরে নিচ্ছেন যে ওপি এটি সঠিকভাবে ব্যবহার করছে, শ্রোতার পদ্ধতির মধ্যে থেকে দস্তাবেজটি সংশোধন করার চেষ্টা করা একটি ব্যতিক্রম উত্পন্ন করবে। তবে আপনি ঠিক বলেছেন: এই প্রশ্নের কোডটি আসলে কিছুই করে না।
অ্যালান মুর

2

পূর্ববর্তী উত্তরগুলির বিকল্প হিসাবে, পেয়ারা'র Splitterএপিআই ব্যবহার করা যেতে পারে যদি ফলস্বরূপ লাইনে অন্যান্য ক্রিয়াকলাপগুলি প্রয়োগ করা হয়, যেমন লাইনগুলি ছাঁটাই করা বা খালি লাইনগুলি ফিল্টার করা:

import com.google.common.base.Splitter;

Iterable<String> split = Splitter.onPattern("\r?\n").trimResults().omitEmptyStrings().split(docStr);

মনে রাখবেন যে ফলাফলটি Iterableএকটি অ্যারে নয়।



1

প্রদত্ত সমস্ত সমাধানের ভিত্তিতে ব্যর্থ চেষ্টা করার পরে। আমি \nকিছু বিশেষ শব্দ দিয়ে প্রতিস্থাপন এবং তারপর বিভক্ত। আমার জন্য অনুসরণটি কৌশলটি করেছে:

article = "Alice phoned\n bob.";
article = article.replace("\\n", " NEWLINE ");
String sen [] = article.split(" NEWLINE ");

আমি প্রশ্নের মধ্যে দেওয়া উদাহরণ প্রতিলিপি করতে পারে না। তবে, আমি মনে করি এই যুক্তি প্রয়োগ করা যেতে পারে।


1

উপরের উত্তরগুলি অ্যান্ড্রয়েডে আমার সহায়তা করে নি, অ্যান্ড্রয়েডে আমার জন্য কাজ করা পেমেমো প্রতিক্রিয়াটির জন্য ধন্যবাদ । আমি সেশেমোর কিছু উত্তর এখানে রেখে দেব :

split("\\\\n")

0
  • এই আশা আপনার জন্য সহায়ক ছিল চেষ্টা করুন

 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");

0

একটি লাইন বিরতি সেট এবং প্রদর্শন করার জন্য তিনটি পৃথক কনভেনশন রয়েছে (এটি বলা যেতে পারে যে এগুলি বাস্তবিক মান)

  • carriage return + + line feed
  • line feed
  • carriage return

কিছু পাঠ্য সম্পাদকগুলিতে অন্যটির জন্য একটির বিনিময় করা সম্ভব:

নোটপ্যাড ++,

সবচেয়ে সহজ জিনিসটি হল স্বাভাবিক হওয়া line feedএবং তারপরে বিভাজন।

final String[] lines = contents.replace("\r\n", "\n")
                               .replace("\r", "\n")
                               .split("\n", -1);

0

শহরে একটি নতুন ছেলে আছে, সুতরাং আপনাকে উপরের সমস্ত জটিলতার সাথে মোকাবিলা করার দরকার নেই। জেডিকে ১১ এর পরে , কেবল কোডের একক লাইন হিসাবে লিখতে হবে এটি লাইনগুলি বিভক্ত করবে এবং আপনাকে স্ট্রিংয়ের স্ট্রিম প্রদান করবে।

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-এবং-API গুলি-ইন-JDK -11 /

আমি আশা করি এটি কারও পক্ষে সহায়ক হবে। শুভ কোডিং।


-1
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]);
        }
    }

}

অন্যান্য উত্তরের তুলনায় এই পদক্ষেপগুলি, যা আরও ব্যাখ্যামূলক এবং কম কোড-ভারী। আপনি এই কোডটি দিয়ে কী সম্পাদন করছেন তা আপনি ব্যাখ্যা করতে পারেন এবং কেন এটি একটি উপযুক্ত উত্তর দেবে?
মাকোটো

2
কোনও ফাইলকে লাইনে বিভক্ত করার সাথে এর কোনও সম্পর্ক নেই। আপনার উত্তর অপসারণ বিবেচনা করুন।
মার্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.