سؤال

هل هناك طريقة لتقسيم bitstring محملة من ملف على الخطوط الجديدة؟ لدي شيء مثل هذا:

A line of text
Additional line of text
And another line

وأريد صفيف مثل هذا:

["A line of text",
"Additional line of text",
"And another line"]

هل هناك وظيفة لتقسيم النص على الخطوط الجديدة لإنتاج شيء مثل هذه الصفيف؟

شكرا مقدما.

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

المحلول

بالإضافة إلى إجابة روبرتس.

في Elixir يمكنك استخدام: String.split(string, "\n")ينظر الى سلسلة وحدة.

نصائح أخرى

ينظر الى binary:split/2/3 في الوحدة الثنائية. على سبيل المثال مع binary:split(String, <<"\n">>).

إذا قمت ببساطة بتقسيم سلسلة على \n, ، هناك بعض مشاكل قابلية النقل الخطيرة. هذا لأن العديد من الأنظمة تستخدم \n, ، عدد قليل مثل استخدام Macs الأقدم \r ويستخدم Windows \r\n لتحديد خطوط جديدة.

الطريقة الأكثر أمانًا للقيام بذلك هي استخدام regex لمطابقة أي من الاحتمالات الثلاثة المذكورة أعلاه:String.split(str, ~r{(\r\n|\r|\n)}.

على الرغم من أن مارك محق في مشاكل قابلية النقل ، إلا أن Regex الذي قدمه يحتوي على خطأ مطبعي فيه ونتيجة لذلك لا يعمل \r\n تسلسل. إليك نسخة أبسط تتعامل مع جميع الحالات الثلاث:

iex(13)> String.split("foo\nbar", ~r/\R/)
["foo", "bar"]
iex(14)> String.split("foo\rbar", ~r/\R/)
["foo", "bar"]
iex(15)> String.split("foo\r\nbar", ~r/\R/)
["foo", "bar"]

لقد واجهت مؤخرًا وضعًا حيث الحل في إجابتي الأخرى وبشكل أساسي ، كان أي حل آخر اعتمادًا على التعبيرات العادية في بعض المواقف أبطأ بكثير من الاعتماد على الانقسام الثنائي ، خاصة عند الحد من كمية الأجزاء التي تنقسم فيها السلسلة. يمكنك ان ترى https://github.com/crowdhailer/server_sent_event.ex/pull/11 لتحليل أكثر تفصيلا ومعيار.

يمكنك استخدام :binary.split/3 حتى عند استهداف أنواع مختلفة من أحرف الخطوط الجديدة:

iex(1)> "aaa\rbbb\nccc\r\nddd" |> :binary.split(["\r", "\n", "\r\n"], [:global])     
["aaa", "bbb", "ccc", "ddd"]

كما ترون في المثال أعلاه ، فإن المباراة جشع و \r\n يأخذ الأسبقية فوق الانقسام \r أولا وبعد ذلك \n.

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