بالإضافة إلى إجابة روبرتس.
في Elixir يمكنك استخدام: String.split(string, "\n")
ينظر الى سلسلة وحدة.
سؤال
هل هناك طريقة لتقسيم 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
.