2012-01-06 17 views
7

मामला:नियमित अभिव्यक्ति - मैच शब्द केवल लाइन में एक बार

  1. अलविदा hellot हैलो अलविदा नमस्ते नमस्ते ehello अलविदा
  2. ehello अलविदा

मैं लाइन 1 (केवल मेल खाते हैं 'हैलो करना चाहते हैं 'एक बार!) लाइन 2 से मिलान नहीं करना चाहते हैं (इसमें' हेलो 'एक से अधिक बार शामिल है)

नकारात्मक देखो का उपयोग करने की कोशिश की आगे पीछे देखो और क्या नहीं ... बिना किसी वास्तविक succ के

^(?!.*\bhello\b.*\bhello\b).*\bhello\b.*$ 

पहले, देखें आप नहीं है 'हैलो' में दो बार, और फिर आप की जाँच करें: ईएसएस ..

उत्तर

4

एक सरल विकल्प यह (बहु ध्वज का उपयोग और नहीं डॉट-सब) है कम से कम एक बार है।
एक ही चीज़ की जांच करने के अन्य तरीके हैं, लेकिन मुझे लगता है कि यह एक बहुत आसान है।

बेशक

, आप \bhello\b के लिए सरल मैच मैचों की संख्या में भरोसा कर सकते हैं ...

+0

क्यों न केवल इसे एक बार ढूंढें और जांचें कि यह उसके बाद फिर से मौजूद नहीं है? उस तरह से थोड़ा कम दोहराया लगता है। – Wiseguy

+1

@Wiseguy - '^। * हैलो (?!। * हैलो) जैसे एक पैटन काम नहीं करेगा, क्योंकि यह हमेशा लाइन के आखिरी 'हैलो' से मेल खाता है। आपको '^ (? :(?! हैलो) जैसे कुछ चाहिए।) * हैलो (?!। * हैलो) ', जो अधिक सुरुचिपूर्ण नहीं है। हालांकि मैंने कुछ आसान याद किया होगा ... – Kobi

+0

@Wiseguy - नहीं। Regex इंजन असफल होने के लिए मैच करने की कोशिश करता है। यह मिल सकता है, तो यह होगा। – Kobi

1

जब से तुम (यानी खाली स्थान के द्वारा अलग टोकन) शब्द के बारे में चिंतित हैं, तो आप सिर्फ रिक्त स्थान पर विभाजित है और देख सकते हैं कितनी बार "hello" प्रकट होता है। चूंकि आप एक भाषा का उल्लेख नहीं था, यहाँ पर्ल में एक कार्यान्वयन है:

use strict; 
use warnings; 

my $a1="ehello goodbye hellot hello goodbye"; 
my $a2="ehello goodbye hello hello goodbye"; 

my @arr1=split(/\s+/,$a1); 
my @arr2=split(/\s+/,$a2); 

#grab the number of times that "hello" appears 

my $num_hello1=scalar(grep{$_ eq "hello"}@arr1); 
my $num_hello2=scalar(grep{$_ eq "hello"}@arr2); 

print "$num_hello1, $num_hello2\n"; 

उत्पादन होता है

1, 2 
2

एक सामान्य regex होगा:

^(?:\b(\w+)\b\W*(?!.*?\b\1\b))*\z 

हालांकि यह क्लीनर हो सकता है इस मैच के परिणाम को उलटा करने के लिए:

\b(\w+)\b(?=.*?\b\1\b) 

यह एक शब्द से मेल खाता है और इसे कैप्चर करके काम करता है, फिर सुनिश्चित करें कि एक लुकहेड और बैकरेफर के साथ यह स्ट्रिंग में कहीं भी नहीं है/नहीं।

+0

दोह, मैंने सवाल को गलत तरीके से पढ़ा, सोचा कि 'हैलो' कोई शब्द हो सकता है, और रेगेक्स का उद्देश्य यह सुनिश्चित करना था कि कोई शब्द दोहराना न पड़े। किसी भी व्यक्ति के लिए किसी भी ब्याज की स्थिति में जवाब छोड़ देंगे। – Qtax

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