/ / जावा रेगेक्स स्ट्रिंग पार्स, एक पैटर्न का पता लगाने की कोशिश कर रहा है - जावा, रेगेक्स

जावा रेगेक्स स्ट्रिंग पार्स, एक पैटर्न - जावा, रेगेक्स को समझने की कोशिश कर रहा है

File file = new File("file-type-string-i-want-2000-01-01-01-01-01.conf.gz");
Matcher matcher = pattern.compile("\-(.*)\-\d{4}")).matcher(fileName);
StringBuilder sb = new StringBuilder();
while (matcher.find()) {
sb.append(matcher.group());
}
stringList = Arrays.asList(sb.toString().split("-"));
if (stringList.size() >= 2) {
nameFragment = stringList.get(stringList.size() - 2);
}

वांछित परिणाम निकालना है

string-iwant

इस तरह लगने वाले तार से

file-type-string-iwant-2000-01-01-01-01-01.conf.gz

दुर्भाग्य से, "स्ट्रिंग-इवंट" का प्रारूप ए हैअल्फ़ा-न्यूमेरिक वर्णों की गैर-निश्चित लंबाई जिसमें केवल एक हाइफ़न शामिल होगा, एक हाइफ़न के साथ शुरू नहीं होता है। दिनांक स्वरूपण सुसंगत है, वर्ष हमेशा स्ट्रिंग के बाद होता है, इसलिए मेरा वर्तमान दृष्टिकोण -year पर मैच करना है, लेकिन मुझे शुरुआत में सामान को छोड़कर कठिनाई हो रही है।

किसी भी विचार या विचारों के लिए धन्यवाद

संपादित करें: अद्यतन स्ट्रिंग्स

उत्तर:

उत्तर № 1 के लिए 4

यहाँ आप की जरूरत regex है:

\-([^-]+\-[^-]+)\-\d{4}\-

मूल रूप से इसका मतलब है:

  • - माइनस से शुरू होता है
  • ([^-]+\-[^-]+) 1 या अधिक गैर-ऋण चिह्न शामिल हैं, फिर एक ऋण, फिर 1 या अधिक गैर-शून्य चिह्न हैं। इस हिस्से पर कब्जा कर लिया है।
  • -d{4} एक ऋण चिन्ह और 4 अंक

हालांकि, यह केवल तभी काम करेगा यदि stuff-you-need केवल है एक हाइफ़न (या हाइफ़न की लगातार मात्रा, जिसे रेगेक्स में सुधार की आवश्यकता होगी)। अन्यथा, यह जानने का कोई तरीका नहीं है कि क्या स्ट्रिंग दी गई है file-type-string-i-want शब्द type आप चाहते हैं या नहीं एक स्टिंग के अंतर्गत आता है।

जोड़ा गया:

मामले में file-type हमेशा एक हाइफ़न होता है, आप आवश्यक भाग को इस तरह से कैप्चर कर सकते हैं:

[^-]+\-[^-]+\-(.*)\-\d{4}\-

स्पष्टीकरण:

  • [^-]+-[^-]+\- गैर-हाइफ़न वर्णों की कुछ मात्रा, फिर एक हाइफ़न, फिर अधिक गैर-हाइफ़न। यह छोड़ देगा file-type निम्नलिखित हाइफ़न के साथ स्ट्रिंग।
  • -d{4}- एक हाइफ़न, 4 अंक के बाद एक अन्य हाइफ़न
  • (.*) पिछले 2 कथनों के बीच की हर चीज को उस स्ट्रिंग के रूप में कैप्चर किया जाता है जिसे आपको चुनने की आवश्यकता है

जवाब के लिए 0 № 2

अगर यह PHP होता तो मैं उस स्ट्रिंग को पकड़ने के लिए निम्नलिखित की तरह कुछ का उपयोग करता।

/^(w+-){2}(?<string>.+?)-d{4}(-d{2}){5}(.w+){2}$/

जवाब के लिए 0 № 3

इस उद्देश्य के लिए मैं जिस रेगेक्स का उपयोग करूंगा वह एक सकारात्मक रूप के साथ है:

Pattern p = Pattern.compile("[^-]+-[^-]+(?=-\d{4})");

जिसका सीधा सा मतलब है कि पाठ से मेल खाना ठीक एक हाइफ़न के बाद एक हाइफ़न और एक 4 अंक वर्ष.

तो आप बस हड़पने कर सकते हैं matcher.group(0) आपके मिलान किए गए पाठ के रूप में string-iwant इस मामले में।