Regex يطابق الكلمات بأكملها فقط
-
20-09-2019 - |
سؤال
لدي تعبير regex أستخدمه للعثور على جميع الكلمات الموجودة في كتلة معينة من المحتوى، غير حساسة لحالة الأحرف، والمضمنة في المسرد المخزن في قاعدة البيانات.هذا هو النمط الخاص بي:
/($word)/i
المشكلة هي إذا استخدمت /(Foo)/i
ثم كلمات مثل Food
الحصول على المطابقة.يجب أن تكون هناك مسافة بيضاء أو حد للكلمة على جانبي الكلمة.
كيف يمكنني تعديل تعبيري ليطابق الكلمة فقط Foo
عندما تكون كلمة في بداية الجملة أو وسطها أو نهايتها؟
المحلول
استخدم كلمة حدود:
/\b($word)\b/i
وأما إذا كنت تبحث عن "S.P.E.C.T.R.E." كما في المثال سنان Ünür ل:
/(?:\W|^)(\Q$word\E)(?:\W|$)/i
نصائح أخرى
لمطابقة أي كلمة كاملة يمكنك استخدام النمط (\w+)
بافتراض أنك تستخدم PCRE أو شيء مشابه:
لقطة الشاشة أعلاه مأخوذة من هذا المثال المباشر: http://regex101.com/r/cU5lC2
مطابقة أي كلمة كاملة في سطر الأوامر مع (\w+)
سأستخدم قذيفة تفاعلية phpsh على أوبونتو 12.10 لإثبات محرك PCRE regex من خلال الطريقة المعروفة باسم preg_match
ابدأ تشغيل phpsh، ثم ضع بعض المحتوى في متغير، ثم قم بمطابقة الكلمة.
el@apollo:~/foo$ phpsh
php> $content1 = 'badger'
php> $content2 = '1234'
php> $content3 = '$%^&'
php> echo preg_match('(\w+)', $content1);
1
php> echo preg_match('(\w+)', $content2);
1
php> echo preg_match('(\w+)', $content3);
0
استخدمت طريقة preg_match محرك PCRE ضمن لغة PHP لتحليل المتغيرات: $content1
, $content2
و $content3
مع ال (\w)+
نمط.
يحتوي $content1 و$content2 على كلمة واحدة على الأقل، بينما لا يحتوي $content3 على كلمة واحدة.
قم بمطابقة عدد من الكلمات الحرفية في سطر الأوامر مع (dart|fart)
el@apollo:~/foo$ phpsh
php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'farty gun';
php> $gun4 = 'unicorn gun';
php> echo preg_match('(dart|fart)', $gun1);
1
php> echo preg_match('(dart|fart)', $gun2);
1
php> echo preg_match('(dart|fart)', $gun3);
1
php> echo preg_match('(dart|fart)', $gun4);
0
تحتوي المتغيرات gun1 وgun2 على سلسلة السهام أو الريح.gun4 لا.ومع ذلك قد تكون هناك مشكلة في البحث عن كلمة fart
اعواد الكبريت farty
.لإصلاح هذه المشكلة، قم بفرض حدود الكلمات في التعبير العادي.
مطابقة الكلمات الحرفية في سطر الأوامر مع حدود الكلمات.
el@apollo:~/foo$ phpsh
php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'farty gun';
php> $gun4 = 'unicorn gun';
php> echo preg_match('(\bdart\b|\bfart\b)', $gun1);
1
php> echo preg_match('(\bdart\b|\bfart\b)', $gun2);
1
php> echo preg_match('(\bdart\b|\bfart\b)', $gun3);
0
php> echo preg_match('(\bdart\b|\bfart\b)', $gun4);
0
إذن فهو نفس المثال السابق باستثناء تلك الكلمة fart
مع \b
حدود الكلمة غير موجودة في المحتوى: farty
.
وعن طريق \b
يمكن أن تسفر عن نتائج مثيرة للدهشة. هل سيكون أفضل حالا معرفة ما يفصل كلمة من تعريفه ودمج هذه المعلومات في النمط الخاص بك.
#!/usr/bin/perl
use strict; use warnings;
use re 'debug';
my $str = 'S.P.E.C.T.R.E. (Special Executive for Counter-intelligence,
Terrorism, Revenge and Extortion) is a fictional global terrorist
organisation';
my $word = 'S.P.E.C.T.R.E.';
if ( $str =~ /\b(\Q$word\E)\b/ ) {
print $1, "\n";
}
وإخراج:
Compiling REx "\b(S\.P\.E\.C\.T\.R\.E\.)\b" Final program: 1: BOUND (2) 2: OPEN1 (4) 4: EXACT (9) 9: CLOSE1 (11) 11: BOUND (12) 12: END (0) anchored "S.P.E.C.T.R.E." at 0 (checking anchored) stclass BOUND minlen 14 Guessing start of match in sv for REx "\b(S\.P\.E\.C\.T\.R\.E\.)\b" against "S.P .E.C.T.R.E. (Special Executive for Counter-intelligence,"... Found anchored substr "S.P.E.C.T.R.E." at offset 0... start_shift: 0 check_at: 0 s: 0 endpos: 1 Does not contradict STCLASS... Guessed: match at offset 0 Matching REx "\b(S\.P\.E\.C\.T\.R\.E\.)\b" against "S.P.E.C.T.R.E. (Special Exec utive for Counter-intelligence,"... 0 | 1:BOUND(2) 0 | 2:OPEN1(4) 0 | 4:EXACT (9) 14 | 9:CLOSE1(11) 14 | 11:BOUND(12) failed... Match failed Freeing REx: "\b(S\.P\.E\.C\.T\.R\.E\.)\b"
واستخدام كلمة حدود \ ب،
وفيما يلي (باستخدام هروب أربعة) يعمل في بيئتي: ماك، رحلات السفاري النسخة 10.0.3 (12602.4.8)
var myReg = new RegExp(‘\\\\b’+ variable + ‘\\\\b’, ‘g’)
إذا كنت تفعل ذلك في المفكرة ++
[\w]+
هل تعطيك كلمة بأكملها، ويمكنك إضافة قوسين للحصول عليه كمجموعة. على سبيل المثال: conv1 = Conv2D(64, (3, 3), activation=LeakyReLU(alpha=a), padding='valid', kernel_initializer='he_normal')(inputs)
. وأود أن نقل LeakyReLU
إلى خط منتجاتها كتعليق، واستبدال تفعيل الحالي. في المفكرة ++ يمكن القيام بذلك باستخدام الأمر التالي نجد:
([\w]+)( = .+)(LeakyReLU.alpha=a.)(.+)
واستبدال يصبح الأمر:
\1\2'relu'\4 \n # \1 = LeakyReLU\(alpha=a\)\(\1\)
والمسافات هو الحفاظ على التنسيق الصحيح في قانون بلدي. :)