كيفية البحث سلسلة CSV والعودة مباراة باستخدام التعابير المنطقية جافا سكريبت

StackOverflow https://stackoverflow.com/questions/1204485

  •  05-07-2019
  •  | 
  •  

سؤال

وأحاول استخراج أول المستخدم حق من منقوطة سلسلة فصل الذي يطابق النمط.

يتم تخزين

وحقوق المستخدمين في شكل:     LAA;LA_1;LA_2;LE_3;

وسلسلة فارغة إذا لم يكن لدى المستخدم أي حقوق.

وأفضل حل بلدي حتى الآن هو استخدام التعابير المنطقية التالية في بيان regex.replace:   .*?;(LA_[^;]*)?.*

و(علامة الاستفهام في نهاية المجموعة لغرض مطابقة الخط كله في حالة المستخدم وليس من حق واستبدال ذلك مع سلسلة فارغة للإشارة إلى أنها لم يكن لديك).

ومع ذلك، فإنه لا يعمل بشكل صحيح في حالة البحث الحالي هو في المركز الأول:   LA_1;LA_2;LE_3;

ومن السهل إصلاحه فقط عن طريق إضافة فاصلة منقوطة في بداية السطر قبل التعابير المنطقية استبدال ولكن سؤالي هو، لماذا ليس بعد مباراة التعبير العادي ذلك؟

و.*?(?:(?:^|;)(LA_[^;]*))?.*

ولقد حاولت العديد من التعابير العادية الأخرى لإيجاد الحل ولكن دون نجاح حتى الآن.

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

المحلول

وأنا لست متأكدا من أنني الحصول على الحق في سؤالك، ولكن في ما يخص التعبيرات العادية التي تستخدمه، وovercomplicating لهم من دون سبب واضح (على الأقل ليس بالنسبة لي). قد تريد شيئا مثل:

function getFirstRight(rights) {
  var m = rights.match(/(^|;)(LA_[^;]*)/)
  return m ? m[2] : "";
}

نصائح أخرى

هل يمكن أن مجرد تقسيم سلسلة أولا:

function getFirstRight(rights)
{
    return rights.split(";",1)[0] || "";
}

للرد على سؤال محدد "؟ لماذا لا التعابير المنطقية التالية تطابق ذلك"، مشكلة واحدة هي مزيج من هذا في البداية:

.*?

وأعقب نهاية المطاف من قبل:

^|;

والذي قد يكون مثل قوله، تجاوز أي الأحرف الزائدة حتى تصل إما البداية أو فاصلة منقوطة. ولكن لا يمكنك تخطي أي شيء ومن ثم يصل في وقت لاحق في بداية (إلا أنها تنطوي على أسطر جديدة في سلسلة متعدد الأسطر).

وشيء من هذا القبيل يعمل:

.*?(\bLA_[^;]).*

ومعنى، والقفز فوق الحروف حتى حدود كلمة تليها "LA _".

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