لماذا لا التعابير العادية استخدام الكلمات بدلا من الشخصيات ؟

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

  •  08-07-2019
  •  | 
  •  

سؤال

حسنا, أنا بالكاد تفهم RegEx أساسيات, ولكن لماذا لا يمكن تصميم ذلك إلى استخدام كلمات مثل (SQL) بدلا من بعض خفي أحرف البدل و الرموز ؟

هو الأداء منذ RegEx تفسير/تحليل في وقت التشغيل?(تجميعها)

أو ربما من أجل سرعة الكتابة ؟ معتبرا أنه عندما تتعلم بعض "بسيطة" تركيبات الأحرف يصبح من الأسهل إلى نوع 1 حرف بدلا من الكلمة ؟

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

المحلول

وأنت تريد حقا <م> هذه

Pattern findGamesPattern = Pattern.With.Literal(@"<div")
    .WhiteSpace.Repeat.ZeroOrMore
    .Literal(@"class=""game""").WhiteSpace.Repeat.ZeroOrMore.Literal(@"id=""")
    .NamedGroup("gameId", Pattern.With.Digit.Repeat.OneOrMore)
    .Literal(@"-game""")
    .NamedGroup("content", Pattern.With.Anything.Repeat.Lazy.ZeroOrMore)
    .Literal(@"<!--gameStatus")
    .WhiteSpace.Repeat.ZeroOrMore.Literal("=").WhiteSpace.Repeat.ZeroOrMore
    .NamedGroup("gameState", Pattern.With.Digit.Repeat.OneOrMore)
    .Literal("-->");

وطيب، ولكن انها جنازتك، رجل.

وتحميل المكتبة أن يفعل هذا هنا:
http://flimflan.com/blog/ReadableRegularExpressions.aspx

نصائح أخرى

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

  • كل حرف هو تعبير عادي تمثل نفسها
  • إذا a و b هي التعابير العادية ، ثم a?, a|b و ab هي التعابير العادية أيضا
  • ...

استخدام الكلمات الرئيسية القائمة على اللغة سيكون عبئا كبيرا بسيطة التعبيرات العادية.معظم الوقت يمكنك فقط استخدام بسيط سلسلة نصية مثل نمط البحث:

grep -R 'main' *.c

أو ربما بسيطة جدا أنماط:

grep -c ':-[)(]' seidl.txt

بمجرد أن تعتاد على التعابير العادية ، بناء الجملة هذا واضح جدا ودقيقة.في حالات أكثر تعقيدا ربما سيتم استخدام شيء آخر منذ الكبيرة العادية التعبير الواضح أنه من الصعب قراءة.

وبيرل 6 هو اتخاذ خطوة ثورية جدا إلى الأمام في قراءة تعبيرات العادية. النظر في عنوان النموذج: 100 E الشارع الرئيسي سبرينغفيلد MA 01234

وإليك معتدلة قراءة بيرل 5 التعابير المنطقية متوافق تحليل أن (كثير من الحالات الزاوية لم يتم التعامل معها):

 m/
     ([1-9]\d*)\s+
     ((?:N|S|E|W)\s+)?
     (\w+(?:\s+\w+)*)\s+
     (ave|ln|st|rd)\s+
     ([:alpha:]+(?:\s+[:alpha:]+)*)\s+
     ([A-Z]{2})\s+
     (\d{5}(?:-\d{4})?)
  /ix;

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

grammar USMailAddress {
     rule  TOP { <addr> <city> <state> <zip> }

     rule  addr { <[1..9]>\d* <direction>?
                  <streetname> <streettype> }
     token direction { N | S | E | W }
     token streetname { \w+ [ \s+ \w+ ]* }
     token streettype {:i ave | ln | rd | st }
     token city { <alpha> [ \s+ <alpha> ]* }
     token state { <[A..Z]>**{2} }
     token zip { \d**{5} [ - \d**{4} ]? }
  }

وA بيرل 6 قواعد اللغة هي فئة، والرموز كلها أساليب invokable. استخدام مثل هذا:

if $addr ~~ m/^<USMailAddress::TOP>$/ {
     say "$<city>, $<state>";
}

وهذا المثال يأتي من قدمت في في المجمدة بيرل 2009 ورشة عمل . تنفيذ Rakudo من بيرل 6 كاملة بما فيه الكفاية أن هذا المثال يعمل اليوم.

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

والنص المصدر الشركة: A قسم: B

والتعابير المنطقية القياسية:

Company:\s+(.+)\s+Dept.:\s+(.+)

وأو حتى:

Company: (.+) Dept. (.+)

وكلمة التعابير المنطقية (تحاول جاهدة حقا لن تحصل على strawman ...)

"Company:" whitespace.oneplus group(any.oneplus) whitespace.oneplus "Dept.:" whitespace.oneplus group(any.oneplus)

وأو مبسطة:

"Company:" space group(any.oneplus) space "Dept.:" space group(any.oneplus)

لا، وربما لم يكن أفضل.

ولأنه يتوافق مع نظرية اللغة الرسمية وتدوين لها الرياضي.

وانها خطأ بيرل ...!

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

تاريخ التعبيرات المعتادة في ويكيبيديا يوضح أكثر من ذلك.

وهناك بدائل لالتعبيرات المنتظمة، ولكن لست متأكدا أي قد اشتعلت في الواقع.

وتحرير: تصحيح من قبل جون سوندرز: كانت تعبيرات عادية <م> شعبية من جانب يونكس، ولكن تنفيذها لأول مرة في وهو المطلوب المحرر. نفس القيود تصميم تطبيق، بل أكثر من ذلك، لنظم في وقت سابق.

في الواقع، لا، فإن العالم لم يبدأ مع يونكس. إذا كنت تقرأ مقالة ويكيبيديا، سترى أن

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

في 1950s، وصفها عالم الرياضيات ستيفن كول كليين هذه النماذج له باستخدام الرموز الرياضية دعت مجموعات العادية. كانت اللغة سنوبول التنفيذ المبكر لمطابقة النمط، ولكن لم تكن متطابقة إلى التعابير العادية. كين تومسون بنيت تدوين كليين في المحرر وهو المطلوب كوسيلة لتتناسب مع أنماط في ملفات نصية. في وقت لاحق وأن أضفت هذا القدرة على يونكس محرر الطبعة، التي أدت في النهاية إلى استخدام شعبية أداة بحث في البقرى من التعابير العادية

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

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

وانها في الواقع من السهل جدا لتنفيذ النموذج "wordier" من التعابير المنطقية - يرجى الاطلاع على جوابي هنا . باختصار: إرسال حفنة من الوظائف التي ترجع سلاسل التعبير العادي (واتخاذ المعلمات إذا لزم الأمر)

وأنا لا أعتقد أن كلمات تعطي أي فائدة. التعابير العادية على هذا النحو هي معقدة ولكنها أيضا قوية جدا.

ما أعتقد أنه أكثر مربكة هو أن كل مكتبة دعم يخترع بناء الجملة الخاص به بدلا من استخدام (أو توسيع) بيرل التعابير المنطقية الكلاسيكية (مثل \ 1، $ 1، {1}، ... لاستبدال والعديد من الأمثلة) .

وأنا أعرف الإجابة على سؤالك بطريقة خاطئة حولها، ولكن RegExBuddy لديه ميزة أن يفسر regexpression الخاص بك في سهل الانجليزية. هذا قد جعله أسهل قليلا للتعلم.

وإذا كانت اللغة التي تستخدمه يعتمد POSIX regexes ، يمكنك استخدامها.

وعلى سبيل المثال:

\d

وسيكون نفس

[:digit:]

والتدوين قوس هو أكثر وضوحا على ما هو عليه مطابقة. ما زلت تعلم "أحرف البدل خفي والرموز، وبما انك سوف لا تزال ترى لهم في التعليمات البرمجية الآخرين وتحتاج إلى فهمها.

وهناك المزيد من الأمثلة في على الصفحة regular-expressions.info في .

لسبب ما، جوابي السابقة حصلت على حذف. على أي حال، أود أن الشيء روبي التعبير العادي آلة صالح مشروع القانون، على http://www.rubyregexp.sf.net . ومن المشروع الخاص بي، ولكن أعتقد أنه يجب أن تعمل.

scroll top