2008-10-16 24 views
6

स्ट्रिंग में एकाधिक शब्दों को खोजने के लिए मैं क्या उपयोग करूं? मैं तार्किक ऑपरेशन होना चाहता हूं और इसलिए कि सभी शब्द स्ट्रिंग में कहीं हैं। मेरे पास बकवास अनुच्छेदों का एक गुच्छा है और एक सादा अंग्रेजी अनुच्छेद है, और मैं इसे "सामान्य" जैसे शब्द और "और" निर्दिष्ट करके इसे कम करना चाहता हूं, लेकिन यह मेरे द्वारा निर्दिष्ट सभी शब्दों से मेल खाता है।रेगेक्स मल्टी शब्द खोज

उत्तर

2

हो सकता है कि एक language recognition chart का उपयोग कर अंग्रेज़ी काम करेगा पहचान करने के लिए। कुछ त्वरित परीक्षण काम करते प्रतीत होते हैं (यह केवल न्यूलाइन द्वारा अलग पैराग्राफ मानता है)।

regexp उन से कोई भी शर्त में से एक से मेल खाएगा ... \ bword \ b द्वारा सीमाओं शब्द \ b अलग शब्द है एक शब्द भी न खत्म होने वाली और सिर्फ शब्द पैरा के किसी भी स्थान में से मेल खाएगी मिलान किया जा रहा है।

my @paragraphs = split(/\n/,$text); 
for my $p (@paragraphs) { 
    if ($p =~ m/\bthe\b|\band\b|\ban\b|\bin\b|\bon\b|\bthat\b|\bis\b|\bare\b|th|sh|ough|augh|ing\b|tion\b|ed\b|age\b|’s\b|’ve\b|n’t\b|’d\b/) { 
     print "Probable english\n$p\n"; 
    } 
} 
+0

मैं अंग्रेजी का पता लगाने के लिए 'चालू' की सिफारिश नहीं करता। इसका अर्थ है 'वह' कई स्लाव भाषाओं में (जैसा कि मुझे यकीन है कि विंको जानता है;) –

+0

यूआरएल स्थानांतरित हो गया है: http://en.wikipedia.org/wiki/Wikipedia:Language_recognition_chart#English –

0

पीसीआरई (पर्ल रेगेक्स) मानते हुए, मुझे यकीन नहीं है कि आप इसे आसानी से कर सकते हैं। और ऑपरेशन regexes का concatenation है, लेकिन आप उस आदेश को अनुमति देने में सक्षम होना चाहते हैं जिसमें शब्दों को औपचारिक रूप से क्रमपरिवर्तन उत्पन्न किए बिना दिखाई देता है। एन शब्दों के लिए, जब एन = 2, यह सहनशील है; एन = 3 के साथ, यह मुश्किल से ठीक है; एन> 3 के साथ, यह स्वीकार्य होने की संभावना नहीं है। तो, सरल पुनरावृत्त समाधान - एन regexes, प्रत्येक शब्द के लिए एक, और यह सुनिश्चित करने के लिए प्रत्येक संतुष्ट है - मुझे सबसे अच्छा विकल्प की तरह लग रहा है।

+0

एन चीजों को फिर से क्यों किया जाना चाहिए? यहां "इंडेक्स" का उपयोग कर सकते हैं। –

+1

\ b (foo | bar | baz) \ b। * \ B (?! \ 1) (foo | bar | baz) \ b। * \ B (?! \ 1) (?! \ 2) (foo | बार | बाज़) \ b को दो बार एक शब्द से मेल खाने से बचने के लिए पीछे संदर्भ और नकारात्मक लुकहेड का उपयोग करके क्रमपरिवर्तन को संभालना चाहिए। यह अभी भी ठीक से बुराई है, लेकिन कम से कम पैटर्न की लंबाई ओ (एन!) – stevemegson

+0

@ बीकेबी: मुझे यकीन नहीं है कि एक इंडेक्स का उपयोग करके आपका क्या मतलब है। –

2

सबसे पहले मैं निश्चित नहीं हूं कि आप क्या लौटने की कोशिश कर रहे हैं ... पूरी सजा? आपके दो दिए गए शब्दों के बीच शब्द?

कुछ की तरह:

\b(word1|word2)\b(\w+\b)*(word1|word2)\b(\w+\b)*\. 

एक पूरा वाक्य जो दो शब्दों से किसी एक या दोनों निहित मेल खाएगा ..

(जहां \b अपनी भाषा में शब्द सीमा है) आप शायद था इसे केस असंवेदनशील बनाने की आवश्यकता है ताकि अगर यह वाक्य की शुरुआत में दिखाई दे तो यह अभी भी

+0

क्या यह सिर्फ एक वाक्य से मेल नहीं खाता है जिसमें दो शब्द होते हैं, या तो शब्द 1 शब्द 2 के बाद, या शब्द 2 शब्द 1 (वांछित) के बाद, या शब्द 1 के बाद शब्द 1, या word2 के बाद word2 (वांछित नहीं) के बाद? उत्तर देने की कोशिश करते समय मैं उस तरह की समस्या का सामना कर रहा था। –

2

AND को संगतता के रूप में

से मेल खाता है
^(?=.*?\b(?:word1)\b)(?=.*?\b(?:word2)\b)(?=.*?\b(?:word3)\b) 

प्रत्यावर्तन के रूप में OR

^(?=.*?\b(?:word1|word2|word3)\b 
^(?=.*?\b(?:word1)\b)|^(?=.*?\b(?:word2)\b)|^(?=.*?\b(?:word3)\b) 
11

नियमित अभिव्यक्तियां "लुकराउंड" स्थिति का समर्थन करती हैं जो आपको एक स्ट्रिंग के भीतर एक शब्द की खोज करने देती है और फिर परिणाम का स्थान भूल जाती है; अगले खोज शब्द के लिए स्ट्रिंग की शुरुआत से शुरू करना। यह किसी भी क्रम में शब्दों के समूह के लिए स्ट्रिंग को खोजने की अनुमति देगा।

इस के लिए नियमित रूप से अभिव्यक्ति है:

^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b) 

कहाँ \b एक शब्द सीमा है और ?= lookaround संशोधक है।

यदि आपके पास शब्दों की एक परिवर्तनीय संख्या है जिसे आप खोजना चाहते हैं, तो आपको लूप के साथ इस नियमित अभिव्यक्ति स्ट्रिंग को बनाने की आवश्यकता होगी - बस लुकराउंड सिंटैक्स में प्रत्येक शब्द को लपेटें और इसे अभिव्यक्ति में संलग्न करें।

+0

बिल्कुल मुझे जो चाहिए था। ध्यान दें कि ऊपर लापता कुछ तारांकन हैं। प्रत्येक खंड '(? =। * \ Bword \ b) होना चाहिए' – Tamlyn

+0

तारांकन वहां थे, लेकिन उन्हें मार्कअप के रूप में माना जा रहा था। मैंने कोड स्वरूपण लागू करके इसे ठीक किया है। –

संबंधित मुद्दे