سؤال

كيف يمكنني استبدال المثيلات الوحيدة لـ بـ (LF وحده مع CRLF) باستخدام تعبير عادي في C#؟

آسف إذا كان هذا سؤالًا غبيًا، فأنا جديد على Regex.

أعرف أن أفعل ذلك باستخدام الخطة String.Replace, ، يحب:

myStr.Replace("\n", "\r\n");
myStr.Replace("\r\r\n", "\r\n");

ومع ذلك، هذا غير أنيق، وسيؤدي إلى تدمير أي " + " موجودة بالفعل في النص (على الرغم من أنه من غير المحتمل وجودها).

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

المحلول

هل هذا الحل مفيد؟

[^\r]\n

يطابق بشكل أساسي الحرف ' ' المسبوق بحرف ليس ' '.

إذا كنت تريد منه اكتشاف الخطوط التي تبدأ بـ ' ' واحد فقط، فحاول

([^\r]|$)\n

والذي ينص على أنه يجب أن يتطابق مع ' ' ولكن فقط تلك التي تمثل الحرف الأول من السطر أو تلك الموجودة لا مسبوق بـ ' '

قد تكون هناك حالات خاصة يجب التحقق منها نظرًا لأنك تعبث بتعريف الأسطر نفسها، فقد لا يعمل "$" بشكل جيد.ولكن أعتقد أنك يجب أن تحصل على هذه الفكرة.

يحرر: CreditKibbee يعد استخدام look-ahead s أفضل بشكل واضح لأنه لن يلتقط الحرف السابق المطابق ويجب أن يساعد في أي حالات حافة أيضًا.إذن هذا هو التعبير العادي الأفضل + يصبح الرمز:

myStr = Regex.Replace(myStr, "(?<!\r)\n", "\r\n");

نصائح أخرى

قد يكون أسرع إذا كنت تستخدم هذا.

(?<!\r)\n

إنه يبحث بشكل أساسي عن أي لا يسبقه .سيكون هذا على الأرجح أسرع، لأنه في الحالة الأخرى، يتطابق كل حرف تقريبًا مع [^ ]، لذلك سيتم التقاط ذلك، ثم البحث عن بعد ذلك.في المثال الذي قدمته، لن يتوقف إلا عند العثور على ، وسينظرون قبل ذلك لمعرفة ما إذا كان قد تم العثور عليه

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

myStr.Replace("(?<!\r)\n", "\r\n")

لقد استخدمت Regex.Replace وعملت

Regex.Replace( oldValue, "(?<!\r)\n", "\r\n")

أعتقد أن "myStr" هو كائن من النوع String، وفي هذه الحالة، هذا ليس regex. و مكافئان لـ CR وLF.

أفضل تخميني هو أنه إذا كنت تعلم أن لديك لكل سطر، بغض النظر عن الأمر، فيجب عليك أولاً إزالة كل .ثم استبدل الكل بـ .

الإجابة التي يقدمها شاكريت ستذهب أيضًا، ولكن بعد ذلك تحتاج إلى استخدام regex، ولكن بما أنك لا تقول ما هو "myStr" ...

تحرير: النظر إلى الأمثلة الأخرى يخبرني بشيء واحد ..لماذا تفعل الأشياء الصعبة، بينما يمكنك فعلها بسهولة؟ لأن هناك تعبيرًا عاديًا، ليس مثل "يجب استخدامه" :D

تحرير 2:تعتبر الأداة ذات قيمة كبيرة عند العبث بالتعبير العادي وxpath وما إلى ذلك مما يمنحك نتائج غريبة، هل يمكنني توجيهك إلى: http://www.regexbuddy.com/

myStr.Replace("([^\r])\n", "$1\r\n");

قد يحتاج $ إلى أن يكون \

جرب هذا:استبدال (Char.ConvertFromUtf32(13)، Char.ConvertFromUtf32(10) + Char.ConvertFromUtf32(13))

إذا كنت أعرف أن نهايات الأسطر يجب أن تكون واحدة من CRLF أو LF، فإن الشيء الذي يناسبني هو

myStr.Replace("\r?\n", "\r\n");

وهذا يفعل الشيء نفسه في الأساس نيسلكيMإجابة باستثناء أنها تنفذ عملية استبدال واحدة فقط على السلسلة بدلاً من اثنتين.وهذا متوافق أيضًا مع محركات Regex التي لا تدعم المظهر الخلفي السلبي أو المراجع الخلفية.

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