سؤال

السؤال السهل هذه المرة.

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

على سبيل المثال ،

Regex.IsMatch("103","[^0]")

و

Regex.IsMatch("103&","[^&]")

سواء العودة الحقيقية (أتوقع كاذبة).

لقد بدأت باستخدام "[^&]" و فكرت ربما الحاجة إلى أن هرب كما \&, ولكن لا يبدو أن تحدث فرقا.

أفكار ؟ أفترض انها شيء صغير.

أيضا, أنا باستخدام .صافي, حتى أن تبقي في الاعتبار.

Edit1:

وجدت هذا, لكن لا يبدو أن الإجابة على المشكلة أواجه.

Edit2:

أردت أن تستجيب كيفن و جويلاقتراحات.هذه الاقتراحات سوف يكون في الواقع أسرع, ولكن لا إنجاز المرونة في هذه الحالة ، حتى إذا وجدت هذا السؤال من خلال البحث, بالتأكيد نتطلع إلى معرفة ما إذا كانت إجابات تناسب احتياجاتك.في حالتي العادية التعبير هو الحصول على تمريرها إلى DataTable التحقق من صحة الطريقة التي الحلقات من خلال كل صف و التحقق من أن محتويات هذا الصف في محدد العمود مباريات RegEx أن يتم الحصول على تمريرها في.منذ سوف تكون إعادة استخدام هذه الطريقة لعدة الأخرى DataTables التي يتم التحقق من صحتها ، أردت أن:

  1. استخدام التعابير المنطقية إلى تمكين أوسع مجموعة من التصديقات ،
  2. دائما ابحث عن تطابق (أيبدلا من استخدام !Regex.IsMatch(الخلية ، regexvariable), أردت أن تعتمد على أن تكون دائما قادرة على استخدام التعابير المنطقية.IsMatch(الخلية ، regexvariable) لأن غالبية DataTables استدعاء هذا الأسلوب سوف يكون باستخدام إيجابية في المباراة بدلا من السلبية.

نأمل أن يساعد.

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

المحلول

الحل هو نصف الحقيقة.المباراة يمكنك مشاهدة الشخصيات الأخرى.ما كنت أريد أن أقول شيئا مثل "مهلا!أنا لا أريد أن أرى هذا الحرف في السلسلة بأكملها".

في هذه الحالة يمكنك القيام به:

Regex.IsMatch("103","^[^0]*$")

نصائح أخرى

نمط [^0] سوف تتطابق مع أي حرف ليس هو صفر.في كل من الأمثلة ، فإن نمط مباراة أول حرف ("1").لاختبار ما إذا كانت السلسلة بأكملها لا تحتوي على أصفار ، ينبغي أن يكون نمط "^[^0]*$".هذا نصها كما يلي:تبدأ في بداية السلسلة, مباراة التعسفي عدد من الشخصيات التي لا الأصفار ، تليها مباشرة نهاية السلسلة.أي سلسلة التي تحتوي على صفر سوف تفشل.أي سلسلة لا تحتوي على أصفار سوف تمر.

إذا كنت تبحث عن حرف واحد في سلسلة ، regex يبدو قليلا من مبالغة.لماذا لا نستخدم فقط .IndexOf أو .يحتوي على ?

أول حرف محلل تصل إلى "1" ، وهو صحيح عن [^0] وفي الصحيح أيضا عن [^&], ولذلك فإنه سيعود صحيح في كل من هذه الأمثلة.

أنت وضع النفي في المكان الخطأ. [^x] سوف تتطابق مع أي شيء ليس x.إذا كان x في السلسلة لا تزال يطابق التعبير إذا كان هناك أي شخصيات أخرى أيضا.بدلا من ذلك تريد أن تطابق صحيح إذا كان x هو هناك ثم ينفي نتيجة الدالة:

Not Regex.IsMatch("103", "0")

Not Regex.IsMatch("103&", "&")

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

جئت عبر هذا السؤال يبحث عن نفس الشيء لكن جافا سكريبت.التعبير أعلاه لا تعمل في حالتي, ولكن جئت عبر أدناه التعبير التي فعلت.(فقط في حالة أي شخص آخر يبحث عن جافا سكريبت حل ينتهي هنا أيضا.)

^((?!0).)*$

هذا بناء ما يسمى السلبية Lookahead

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