سؤال

على سبيل المثال، في هذا النص:

Lorem Ipsum Dolor Sit Amet، Consectetur Adipiscing Elet. NUSC EUE Tellus Vel Nunc Petium Lacinia. proin sed lorem. cras sed ipsum. NUNC ل Libero Quis Risus Sollicitudin Imperdiet.

أريد أن أتفق مع الكلمة بعد "ipsum".

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

المحلول

هذا يبدو وكأنه وظيفة ل Lookbehinds، على الرغم من أنك يجب أن تدرك أنه ليس كل النكهات Regex تدعمها. في مثالك:

(?<=\bipsum\s)(\w+)

سيؤدي ذلك إلى مطابقة أي تسلسل من أحرف الرسالة التالية "ipsum" ككلمة كاملة تليها مساحة. نعم هو كذلك ليس تطابق "Ipsum" نفسه، لا داعي للقلق بشأن إعادة إدخاله في حالة، مثل بدائل.

كما قلت، رغم ذلك، فإن بعض النكهات (JavaScript، على سبيل المثال) لا تدعم lookbehind على الإطلاق. العديد من الآخرين (معظمهم، في الواقع) يدعمون فقط Lookbehinds "العرض الثابت" - حتى تتمكن من استخدام هذا المثال ولكن ليس من مشغلي التكرار. (بعبارات أخرى، (?<=\b\w+\s+)(\w+) لن الشغل.)

نصائح أخرى

اقترح بعض المستجيبين الآخرين باستخدام Regex لا يعتمدون على lookbehinds، لكنني أعتقد أن مثال يعمل الكامل، هناك حاجة إلى نقطة عبر. هذه الفكرة هي أن تتطابق مع التسلسل بأكمله ("ipsum" بالإضافة إلى الكلمة التالية) بالطريقة العادية، ثم استخدم مجموعة التقاط لعزل الجزء الذي يهمك. علي سبيل المثال:

String s = "Lorem ipsum dolor sit amet, consectetur " +
    "adipiscing elit. Nunc eu tellus vel nunc pretium " +
    "lacinia. Proin sed lorem. Cras sed ipsum. Nunc " +
    "a libero quis risus sollicitudin imperdiet.";

Pattern p = Pattern.compile("ipsum\\W+(\\w+)");
Matcher m = p.matcher(s);
while (m.find())
{
  System.out.println(m.group(1));
}

لاحظ أن هذا يطبع كلا من "Dolor" و "NUNC". للقيام بذلك مع إصدار Lookbehind، عليك أن تفعل شيئا ما يتراخان مثل:

Pattern p = Pattern.compile("(?<=ipsum\\W{1,2})(\\w+)");

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

ومع ذلك، يبدو أن أكبر مشكلة الأشخاص الذين يواجهون في أمثلةهم ليست مع Lookbehinds، ولكن مع حدود الكلمات. يبدو أن كلا ديفيد كيمب و CK يتوقع \b لتتناسب مع حرف المساحة التالية "م"، لكنه لا؛ يطابق الموضع (أو الحدود) ما بين "م" والمساحة.

إنه خطأ شائع، واحد رأيته متكرر في عدد قليل من الكتب والبرامج التعليمية، ولكن بناء حدود الكلمة، \b, ، لا تتطابق أبدا عن أي شخصيات. إنه تأكيد صفر وعرض، مثل Lookarounds والميراتين (^, $, \z, ، وما إلى ذلك)، وما يطابقه هو موضع إما مسبق بحرف كلمة وليس متبوعا، أو متبوعا بحرف كلمة وليس سببا واحدا.

ipsum B ( W *)

مع javascript يمكنك استخدام (?=ipsum.*?(\w+))

سيحصل ذلك على الحدوث الثاني أيضا (NUNC)

ipsum b (. *) ب

تحرير: على الرغم من اعتماده على تطبيق Regex الخاص بك، إلا أن هذا يمكن أن يكون جائعا ويجد كل الكلمات بعد مؤشرات الإستراتيجية

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