2011-03-09 18 views
23

की स्थिति (रों) मिलता है मैं एक रेगुलर एक्सप्रेशन से मेल और मैचमाणिक regex: से मेल खाते हैं और

उदाहरण के लिए की स्ट्रिंग में स्थिति प्राप्त करना चाहते हैं,

"AustinTexasDallasTexas".match_with_posn /(Texas)/ 

मैं चाहूँगा match_with_posn कुछ ऐसा करने के लिए: [6, 17] जहां 6 और 17 टेक्सास शब्द के दोनों उदाहरणों के लिए प्रारंभिक स्थिति हैं।

क्या ऐसा कुछ है?

की
+0

संभव डुप्लिकेट [सभी घटनाओं की अनुक्रमित पाने के लिए कैसे एक स्ट्रिंग में एक पैटर्न के] [http://stackoverflow.com/questions/4274388/how-to-get-indexes-of-all-occurrences-of-a-pattern-in-a-string) – Nakilon

उत्तर

43

रूबी 1.8.6+ उपयोग करके, आप यह कर सकते हैं:

require 'enumerator' #Only for 1.8.6, newer versions should not need this. 

s = "AustinTexasDallasTexas" 
positions = s.enum_for(:scan, /Texas/).map { Regexp.last_match.begin(0) } 

इस के साथ एक सरणी पैदा करेगा:

=> [6, 17] 
की
+0

यदि आप Isateateatest में एटीए खोजना चाहते हैं तो यह वापस आ जाएगा [2], लेकिन 5 भी संभावना है – adcosta

+2

इंडेक्स 5 में "ए" का उपयोग इंडेक्स 2 में मिले "एटीए" से मेल खाने के लिए किया जाता है। यदि आप "एटी" खोजते हैं , आपको '[2, 5, 8] 'की सरणी मिल जाएगी। यदि आप ओवरलैपिंग मैचों को ढूंढना चाहते हैं, तो एक लुकहेड दावे का उपयोग करें: '/ (? = (एटीए)) /'। 'पद = s.enum_for (: स्कैन, /(?=(atea))/).map {Regexp.last_match.begin (0)} # => [2, 5]' –

+0

क्या वह व्यक्ति जिसने इसे वोट दिया है कृपया नीचे वोट की व्याख्या? –

24

क्रमबद्ध, String#index

"AustinTexasDallasTexas".index /Texas/ 
=> 6 

अब देखते हैं, आप स्ट्रिंग एपीआई का विस्तार कर सकते हैं।

class String 
    def indices e 
    start, result = -1, [] 
    result << start while start = (self.index e, start + 1) 
    result 
    end 
end 
p "AustinTexasDallasTexas".indices /Texas/ 
=> [6, 17] 
+0

एक जैसा काम करता है आकर्षण! अच्छा! – Tilo

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