2011-09-06 16 views
5

मिलान पैटर्न मैं सभी इनपुट स्ट्रिंग है कि दिए गए पैटर्न से मेल में सबस्ट्रिंग पाने के लिए कोशिश कर रहा हूँ।जावा पुनरावर्ती (?) दोहराया (?) गहरी (?)

उदाहरण के लिए,

को देखते हुए स्ट्रिंग: aaxxbbaxb
पैटर्न: एक [az] {0.3} ख
(क्या मैं वास्तव में व्यक्त करना चाहता हूँ है: सभी पैटर्न है कि एक साथ शुरू होता है और साथ समाप्त होता है

aaxxb: सूचकांक 0 ~ 4
axxb: सूचकांक 1 ~ 4
ख है, लेकिन उन दोनों के बीच में अप करने के लिए 2 अक्षर)

सटीक परिणाम है कि मैं चाहता हूँ (उनके अनुक्रमित के साथ) हो सकता हैaxxbb: सूचकांक 1 ~ 5
axb: सूचकांक 6 ~ 8

लेकिन जब मैंने उसे Pattern.compile() और Matcher.find() का उपयोग कर पैटर्न और Matcher कक्षाओं के माध्यम से चलाने के लिए, यह केवल मुझे देता है:

aaxxb: सूचकांक 0 ~ 4
धुरी: सूचकांक 6 ~ 8

यह मेरे द्वारा उपयोग किए जाने वाले कोड का टुकड़ा है।

Pattern pattern = Pattern.compile("a[a-z]{0,3}b", Pattern.CASE_INSENSITIVE); 
Matcher match = pattern.matcher("aaxxbbaxb"); 
while (match.find()) { 
    System.out.println(match.group()); 
} 

मैं स्ट्रिंग है कि पैटर्न से मेल खाता है की हर एक टुकड़ा कैसे प्राप्त कर सकते हैं?

बेशक

, यह के रूप में यह कुशल :) है, पैटर्न और Matcher वर्गों का उपयोग करने की जरूरत नहीं है जब तक

+0

आपके यहां 'a [a-z]। {0,2} b' में डॉट क्यों है? यदि आप पाटर 'a_b' रखना चाहते हैं जहां '_' 0-2 वर्णमाला वर्ण हो सकता है तो बिंदु वहां गलत है, है ना? – user219882

+2

'एएक्सएक्सबीबी' एक स्ट्रिंग कैसा है जो बी के साथ शुरू होता है और समाप्त होता है "और * के बीच * दो अक्षर हो सकते हैं? – jmg

+0

धन्यवाद टॉम और जेएमजी इंगित करने के लिए !!! मैंने मूल पोस्ट संपादित किया। – cnc4ever

उत्तर

0

एक बात तुम कर सकते हो रहा है:

  • सभी संभव सबस्ट्रिंग कि कर रहे हैं 4 बनाएं वर्ण या उससे अधिक समय (अच्छा उस के साथ भाग्य यदि आपके स्ट्रिंग बड़ी है)
  • ) एक खोजने के बजाय इन सबस्ट्रिंग
  • एक मैच (कर से प्रत्येक) (
  • के लिए एक नया Matcher बनाएं
  • पूर्ण-स्ट्रिंग के सापेक्ष ऑफसेट और मिलान की जानकारी से ऑफसेट की गणना
1

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

तीन खोज लक्ष्य है कि। सबसे कारगर तरीका मैं के बारे में सोच सकते हैं यह करने के लिए कुछ संशोधनों के साथ Knuth-Morris-Pratt एल्गोरिथ्म की तरह एक खोज एल्गोरिथ्म का उपयोग करने, होगा। जाहिर है

for i in 0 to sourcestring.length 
    check sourcestring[i] - is it a? if so, check sourcestring[i+x] 
     // where x is the index of the search string - 1 
    if matches then save i to output list 
    else i = i + searchstring.length 

यदि आप एक स्थिति मैच आप तो सुनिश्चित करें कि वे वर्णमाला हैं बनाने के लिए स्ट्रिंग के भीतर पात्रों की जांच करना चाहिए है: वास्तव में अपने स्यूडोकोड की तरह कुछ होगा।

एल्गोरिथ्म 3 बार, प्रत्येक खोज पद के लिए एक चलाते हैं।पैटर्न मिलान का उपयोग करके खोज करने की कोशिश करने से यह बेहद तेज़ होगा।

संपादित करें - क्षमा करें, प्रश्न को ठीक से नहीं पढ़ा। यदि आप में रेगेक्स का उपयोग करने के लिए है तो उपर्युक्त आपके लिए काम नहीं करेगा।

+0

हम्म .. तीन व्यक्तिगत लक्ष्यों के लिए खोज। धन्यवाद, मैं इसे देख लूंगा! – cnc4ever

3

(देखें: All overlapping substrings matching a java regex)

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

public static void allMatches(String text, String regex) 
    { 
    for (int i = 0; i < text.length(); ++i) { 
     for (int j = i + 1; j <= text.length(); ++j) { 
     String positionSpecificPattern = "((?<=^.{"+i+"})("+regex+")(?=.{"+(text.length() - j)+"}$))"; 
     Matcher m = Pattern.compile(positionSpecificPattern).matcher(text); 

     if (m.find()) 
     { 
      System.out.println("Match found: \"" + (m.group()) + "\" at position [" + i + ", " + j + ")"); 
     } 
     } 
    } 
    } 
संबंधित मुद्दे