रेगेक्स पूरे शब्दों से ही मेल खाता है


90

मेरे पास एक regex अभिव्यक्ति है जो मैं सामग्री के किसी दिए गए ब्लॉक में सभी शब्दों को खोजने के लिए उपयोग कर रहा हूं, मामला असंवेदनशील है, जो एक डेटाबेस में संग्रहीत शब्दावली में निहित है। यहाँ मेरा पैटर्न है:

/($word)/i

समस्या यह है, अगर मैं उपयोग करता हूं /(Foo)/iतो जैसे शब्द Foodमेल खाते हैं। शब्द के दोनों ओर व्हॉट्सएप या एक शब्द सीमा होनी चाहिए।

Fooकिसी वाक्य के आरंभ, मध्य या अंत में एक शब्द होने पर मैं अपनी अभिव्यक्ति को केवल शब्द से कैसे जोड़ सकता हूं ?

जवाबों:


120

शब्द सीमाओं का उपयोग करें:

/\b($word)\b/i

या यदि आप "स्पान्टर" खोज रहे हैं जैसे कि सिनान नूर का उदाहरण:

/(?:\W|^)(\Q$word\E)(?:\W|$)/i

1
जब आप पोस्ट किए थे तब मैं इस उत्तर के लंबे-लंबे संस्करण को टाइप कर रहा था। :)
ZombieSheep


@ रीचर्डसिमो और \b[-|+][0-9]+\bमैच +10में 43E+10। दोनों मैं नहीं चाहता
अल्हलाल

क्या होगा यदि मैं ऐसे शब्द को खोजना चाहता हूं जो कि जोड़ा नहीं गया है या किसी अन्य शब्द में निहित नहीं है। तब यह तर्क काम नहीं करेगा
प्रसन्ना सासने

किसी को गणितीय तुलना ऑपरेटर> = और <= कैसे मिलेगा?
एंटोनैक

50

किसी भी पूरे शब्द से मेल खाने के लिए आप पैटर्न का उपयोग करेंगे (\w+)

मान लें कि आप PCRE या कुछ इसी तरह का उपयोग कर रहे हैं:

यहाँ छवि विवरण दर्ज करें

इस लाइव उदाहरण से ऊपर लिया गया स्क्रीनशॉट: http://regex101.com/r/cU5lC2

कमांडलाइन पर किसी भी पूरे शब्द का मिलान करना (\w+)

मैं Ubuntu 12.10 पर phpsh इंटरेक्टिव शेल का उपयोग कर रहा हूँ , जो कि preg_match के रूप में ज्ञात विधि के माध्यम से PCRE regex इंजन को प्रदर्शित करता है

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 विधि PHP भाषा भीतर PCRE इंजन का इस्तेमाल किया चर विश्लेषण करने के लिए: $content1, $content2और $content3साथ (\w)+पैटर्न।

$ सामग्री 1 और $ सामग्री 2 में कम से कम एक शब्द होता है, $ सामग्री 3 नहीं होती है।

कमांडलाइन पर कई शाब्दिक शब्दों का मिलान करें (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

वेरिएबल्स गन 1 और गन 2 में स्ट्रिंग डार्ट या फार्ट हैं। गन ४। हालाँकि यह एक समस्या हो सकती है जो शब्द 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:।


हूँ, pm शब्द नहीं है?
मिनियन

यदि आप शब्दों को होने के लिए मजबूर करना चाहते हैं, और (वे नहीं हैं, तो वे शब्दकोष हैं) तो अपने रेक्सक्स इंजन के लिए शब्द वर्ण के रूप में अवधि जोड़ें। आपके लिए ऐसा प्रतीत होता है कि आपने एक शब्द वर्ण के रूप में अवधि निर्धारित की है, इसलिए इसलिए रेगेक्स शब्द एक-से-एक नहीं होंगे और "शब्द" की मानक परिभाषा के लिए जिसे आप अपने हाइब्रिड यूरोपीय के लिए अपने यूरोपीय शब्दकोश में पढ़ाए गए थे भाषा (या उस मामले के लिए कोई अन्य भाषा)।
एरिक लेसचिंस्की

8

प्रयोग करने से \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";
}

आउटपुट:

REx "\ b" (S \ .P \ .E \ .C \ .T \ .R \ .E \ _। \ _) संकलन कर रहा है।
अंतिम कार्यक्रम:
   1: BOUND (2)
   2: OPEN1 (4)
   4: सटीक (9)
   9: CLOSE1 (11)
  11: BOUND (12)
  12: END (0)
0 पर एंकर "स्पेकटर" (एंकरिंग की जाँच करना) BOUND minlen 14 को रोकना
RE के लिए sv में मैच की शुरुआत का अनुमान "S (। S \ .P \ .E \ .C \ _T। \ _ .R \ _E।)" B "को" SP "के विरुद्ध लगाएं।
TheECTRE (काउंटर-इंटेलिजेंस के लिए विशेष कार्यकारी, "...
ऑफसेट 0 पर लंगर पदार्थ "विनिर्देशक" मिला ...
start_shift: 0 check_at: 0 s: 0 endpos: 1
STCLASS का विरोध नहीं करता ...
अनुमान: ऑफसेट 0 पर मैच
REx "\ b" (S \ .P \ .E \ .C \ .T \ .R \ .E \।) का मिलान करते हुए "स्पेकटर" (विशेष परीक्षा) के खिलाफ
काउंटर-इंटेलिजेंस के लिए, "...
   0 | 1: बाध्य (2)
   0 | 2: OPEN1 (4)
   0 | 4: सटीक (9)
  14 | 9: CLOSE1 (11)
  14 | 11: बाध्य (12)
                                  अनुत्तीर्ण होना...
मैच विफल रहा
नि: शुल्क रेक्स: "

1
मुझे लगता है कि एक शब्द आमतौर पर एक \ w शब्द होगा, लेकिन दिलचस्प बिंदु।
रिचर्ड सिमेस 20

1

शब्द सीमाओं का उपयोग करें,

मेरे वातावरण में निम्नलिखित (चार एस्केप का उपयोग) काम करता है: मैक, सफारी संस्करण 10.0.3 (12602.4.8)

var myReg = new RegExp(‘\\\\b’+ variable + ‘\\\\b’, ‘g’)

1

उन लोगों के लिए जो अपने कोड में एक एनम को मान्य करना चाहते हैं आप गाइड का पालन कर सकते हैं

रेगेक्स वर्ल्ड में आप ^एक स्ट्रिंग शुरू $करने और इसे समाप्त करने के लिए उपयोग कर सकते हैं । उनके संयोजन में उनका उपयोग करना |जो आप चाहते हैं:

^(Male)$|^(Female)$

यह केवल Maleया Femaleमामले के लिए सच लौटेगा ।


^और $एक पंक्ति की शुरुआत (क्रमशः अंत) से मेल खाते हैं, इसलिए आपका उदाहरण केवल तभी मैच करेगा जब वे लाइन में केवल शब्द हैं।
gented

और यह वही है जो मैं चाहता हूं जब मैं एक एनम को मान्य करना चाहता हूं! समस्या क्या है?
मोहम्मद्रेज़ाहीमियानगोल्कंदानी

0

यदि आप इसे Notepad ++ में कर रहे हैं

[\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\)

रिक्त स्थान मेरे कोड में सही स्वरूपण रखने के लिए है। :)


-1

एक स्ट्रिंग में सभी "शब्द" प्राप्त करें

/([^\s]+)/g

मूल रूप से ^/sरिक्त स्थान (या गैर-रिक्त स्थान के मेल समूहों) पर ब्रेक का मतलब लालची
के gलिए मत भूलना

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.