سؤال
كيف يمكنني مطابقة الكلمات الثلاث في السلسلة التالية مع تعبير منتظم متوافق مع بيرل؟
Word1 # $ Word2 # $ Word3
لا أعرف الكلمات الفعلية "Word1 و Word2 و Word3" مقدما. أنا أعرف فقط الفاصل، وهو # $.
ولا يمكنني استخدام حدود الكلمة لأن لدي ترميز متعدد البياضات. هذه الوسيلة على سبيل المثال أن السلسلة يمكن أن تحتوي على أحرف غير ASCII مثل Umlauts والتي لم يتم الكشف عنها بواسطة حرف التحكم W.
المحلول
جرب هذا التعبير العادي:
/(\w+)#\$(\w+)#\$(\w+)/
يحرربعد شريط لنا بمزيد من المعلومات (انظر التعليقات على هذه الإجابة):
/((?:[^#]+|#[^$])*)#\$((?:[^#]+|#[^$])*)#\$((?:[^#]+|#[^$])*)/
نصائح أخرى
#!/usr/bin/perl
use strict;
use warnings;
my $x = 'word1#$word2#$word3';
print $_, "\n" for split /#\$/, $x;
$str = explode('#$', $str);
Regex مبهج لهذا.
قد تكون وظيفة الانقسام مفيدة على الرغم من أنها تعتمد على ما تريد القيام به مع الخط.
هنا مثال على الرغم من.
my $line = "word1#$word2#$word3"
my @words = split('#$', $line)
هذا سيعمل لأي سلسلة لديها 2 #
/([^#]+)\#\$([^#]+)\#\$([^#]+)/
/([^#]*?)#\$([^#]*?)#\$([^#]*)/
لا تنتمي إلى StackOverflow