نمط Regex - يسمح باستخدام الحروف الأبجدية الرقمية، ومجموعة من الأحرف الخاصة، ولكن ليس تسلسلًا معينًا من الأحرف

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

  •  06-07-2019
  •  | 
  •  

سؤال

لدي التعبير العادي التالي:

(?!^[&#]*$)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$

لذا، اسمح باستخدام A-Z، وa-Z، و0-9، وهذه الأحرف الخاصة '.,&@:?!()$#/\

أريد عدم المطابقة إذا تمت مواجهة مجموعة الأحرف التالية في أي مكان في السلسلة بهذا الترتيب:

&#

عندما أقوم بتشغيل هذا التعبير العادي باستخدام "&#" فقط كمدخل، فإنه لا يتطابق مع النمط الخاص بي، أحصل على خطأ، رائع.عندما أقوم بتشغيل regex مع '.,&@:?!()$#/\ABC123 إنه يتطابق مع النمط الخاص بي، ولا توجد أخطاء.

ولكن عندما أقوم بتشغيله مع:

'.,&#@:?!()$#/\ABC123

ولا يخطئ أيضاً.أفعل شيئًا خاطئًا أثناء التحقق من التسلسل &#.

هل يمكن لأحد أن يخبرني ما الخطأ الذي ارتكبته، فأنا لست جيدًا في هذه الأشياء.

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

المحلول

إزالة استعارة تقنية مطابقة السلاسل المقتبسة & من فئة شخصيتك، قم بإضافة بديل لـ & لا تليها #, ، والسماح للسلسلة بالانتهاء اختياريًا بـ &:

^((?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&[^#])*&?)$

نصائح أخرى

سأفعل ذلك في الواقع في جزأين:

  1. تحقق من مجموعة الأحرف المسموح بها.للقيام بذلك، سأبحث عن الأحرف غير المسموح بها، وأرجع خطأً إذا كان هناك تطابق.وهذا يعني أن لدي تعبيرًا بسيطًا ولطيفًا:
    [^A-Za-z0-9'\.&@:?!()$#^]
  2. تحقق من السلسلة الفرعية المحظورة.وبما أنها مجرد سلسلة فرعية، فربما لن أستخدم التعبير العادي لهذا الجزء.

لم تذكر لغتك، ولكن إذا كنت تستخدم لغة C#:

bool IsValid(string input)
{
    return !(   input.Contains("&#")  
               || Regex.IsMatch(@"[^A-Za-z0-9'\.&@:?!()$#^]", input) 
            );
}

و^((?!&#)[A-Za-z0-9-'.,&@:?!()$#/\\])*$

ملحوظة التي هرب \ الماضي (الضعف) SO تلقائيا يتحول إلى \\ \ إن لم يكن في backticks

وعلى افتراض بيرل متوافق التعبير العادي

للا تتطابق على سلسلة "& #":

<اقتباس فقرة>   

و(?![^&]*&#)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$

وعلى الرغم من أنك لا تحتاج قوسين لأنك مطابقة السلسلة بأكملها.

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

^(?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&(?!#))+$

ولأنني استخدمت lookahead السلبي بدلا من فئة الطابع انتفى، التعبير المعتاد لا تحتاج إلى أي مساعدة إضافية لتتناسب مع العطف في نهاية السلسلة.

أوصي باستخدام تعبيرين عاديين في حالة شرطية:

    if (string has sequence "&#")
      return false
    else
      return (string matches sequence "A-Za-z0-9-'.,&@:?!()$#/\")

أعتقد أن التعبير العادي "الرئيسي" الثاني الخاص بك هو

^([A-Za-z0-9-'.,&@:?!()$#/\])$"

فيه عدة أخطاء:

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

قد يكون من الأفضل لك استخدام

^[A-Za-z0-9-'.,&@:?!()$#/\\]+$

لاحظ أنه يتم تمثيل حرف الشرطة المائلة بشرطة مائلة مزدوجة.

ال + يشير الحرف إلى أن حرفًا واحدًا على الأقل يتم اختباره يجب أن يتطابق مع التعبير العادي؛إذا كان من الجيد تمرير سلسلة ذات طول صفري، فاستبدل + مع *.

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