سؤال

لدي تعبير 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 أو شيء مشابه:

enter image description here

لقطة الشاشة أعلاه مأخوذة من هذا المثال المباشر: 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\)

والمسافات هو الحفاظ على التنسيق الصحيح في قانون بلدي. :)

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