से मेल खाने वाले सभी ओवरलैपिंग सबस्ट्रिंग्स क्या कोई एपीआई विधि है जो नियमित अभिव्यक्ति से मेल खाने वाले सभी (संभावित रूप से ओवरलैपिंग) सबस्ट्रिंग्स लौटाती है?जावा रेगेक्स
उदाहरण के लिए, मेरे पास एक टेक्स्ट स्ट्रिंग है: String t = 04/31 412-555-1235;
, और मेरे पास एक पैटर्न है: Pattern p = new Pattern("\\d\\d+");
जो दो या दो से अधिक वर्णों के तारों से मेल खाता है।
मैचों मैं कर रहे हैं: 04, 31, 412, 555, 1235
मैं कैसे अतिव्यापी मैचों मिलता है?
मैं कोड लौटना चाहते: 04, 31, 41, 412, 12, 55, 555, 55, 12, 123, 1235, 23, 235, 35.
सैद्धांतिक रूप से यह संभव हो जाना चाहिए - एक स्पष्ट O(n^2)
एल्गोरिदम है जो पैटर्न के खिलाफ सभी सबस्ट्रिंग को दर्शाता है और जांचता है।
संपादित
बल्कि सभी सबस्ट्रिंग की गणना की तुलना में, यह Matcher
में region(int start, int end)
विधि का उपयोग करने सुरक्षित है। एक अलग, निकाले गए सबस्ट्रिंग के खिलाफ पैटर्न की जांच करना मैच के परिणाम को बदल सकता है (उदाहरण के लिए यदि पैटर्न के प्रारंभ/अंत में गैर-कैप्चरिंग समूह या शब्द सीमा जांच है)।
संपादित 2
वास्तव में, यह है कि क्या region()
आप शून्य चौड़ाई मैचों के लिए क्या उम्मीद करता है स्पष्ट नहीं है। विनिर्देश अस्पष्ट है, और प्रयोग निराशाजनक परिणाम पैदा करते हैं।
उदाहरण के लिए:
String line = "xx90xx";
String pat = "\\b90\\b";
System.out.println(Pattern.compile(pat).matcher(line).find()); // prints false
for (int i = 0; i < line.length(); ++i) {
for (int j = i + 1; j <= line.length(); ++j) {
Matcher m = Pattern.compile(pat).matcher(line).region(i, j);
if (m.find() && m.group().size == (j - i)) {
System.out.println(m.group() + " (" + i + ", " + j + ")"); // prints 90 (2, 4)
}
}
}
मुझे यकीन है कि जो सबसे सुरुचिपूर्ण समाधान है नहीं कर रहा हूँ। pat
मैचों की जांच करने से पहले एक दृष्टिकोण line
और पैड को उचित सीमा वर्णों के साथ एक सबस्ट्रिंग लेना होगा।
संपादित 3
यहाँ पूर्ण समाधान है कि मैं के साथ आया है। यह मूल नियमित अभिव्यक्ति में शून्य-चौड़ाई पैटर्न, सीमाएं इत्यादि को संभाल सकता है। यह टेक्स्ट स्ट्रिंग के सभी सबस्ट्रिंग्स को देखता है और यह जांचता है कि नियमित अभिव्यक्ति केवल शुरुआत और अंत में उचित संख्या में वाइल्डकार्ड के साथ पैटर्न को पैड करके विशिष्ट स्थिति पर मेल खाती है या नहीं। ऐसा लगता है कि मैंने कोशिश किए मामलों के लिए काम किया - हालांकि मैंने व्यापक परीक्षण नहीं किया है। यह निश्चित रूप से यह संभवतः कम कुशल है।
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 + ")");
}
}
}
}
संपादित 4
यहाँ ऐसा करने का एक बेहतर तरीका है: https://stackoverflow.com/a/11372670/244526
संपादित 5
JRegex पुस्तकालय एक जावा regex मिलान सभी ओवरलैपिंग सबस्ट्रिंग खोजने (हालांकि समर्थन करता है ऐसा लगता है कि थोड़ी देर में अपडेट नहीं किया गया है)।विशेष रूप से, documentation on non-breaking search निर्दिष्ट करता है:
आप एक पैटर्न के सभी संभव occureneces खोजने सकते हैं उन है कि अन्तर्विभाजक या नेस्टेड रहते हैं सहित, नॉन-ब्रेकिंग खोज का उपयोग करना। यह है Matcher की विधि का उपयोग करके प्राप्त आगे बढ़ना (खोज() के बजाय)
सभी 3 या अधिक वर्णों के परिणामस्वरूप पोस्ट-रेगेक्स लूपिंग करें –
http://regexlib.com/ कुछ खुदाई करने के लिए एक अच्छी जगह हो सकती है। –
@ Ωmega मेरी पूरी कोशिश कर रहा है, लेकिन फीडबैक के लिए खुला है जो उपयोगी नहीं है। चीयर्स। –