स्ट्रिंग्स की सूची निम्नलिखित को देखते हुए:बग। भविष्य में?
List<String> progLangs = Arrays.asList("c#", "java", "python", "scala");
और एक regex पैटर्न है कि 4 अक्षर लोअरकेस स्ट्रिंग से मेल खाना चाहिए।
Pattern p = Pattern.compile("[a-z]{4}");
अब मैं progLangs
के तत्वों कि पैटर्न p
को फिट खोजने के लिए चाहते हैं।
for (String lang : progLangs) {
if (p.matcher(lang).matches()) {
System.out.println(lang);
}
}
मैं उम्मीद परिणाम प्राप्त:
यह पुराना तरीका कर
java
लेकिन जब मैं जावा 8 धारा के साथ एक ही प्राप्त करने और का उपयोग कर एक विधेय के पैटर्न को बदलने के लिए कोशिश Pattern.asPredicate:
progLangs.stream()
.filter(p.asPredicate())
.forEach(System.out::println);
परिणाम है:
java
python
scala
ऐसा क्यों है? ऐसा लगता है कि Patter.asPredicate एक अनुमान उत्पन्न करता है जो आंशिक मिलान स्वीकार करता है। पैटर्न एपीआई में समतुल्य क्या है? documentation केवल कहता है:
एक अनुमान बनाता है जिसका उपयोग स्ट्रिंग से मेल खाने के लिए किया जा सकता है।
मैं अपेक्षा करता हूं कि यह सामान्य Pattern.matcher(String).matches()
हो लेकिन यह कुछ और है ... इस असंगतता को कैसे समझाया जाए?
ऐसा लगता है कि आप सही हैं। हालांकि, मैं अभी भी समझ नहीं पा रहा हूं कि उन्होंने इसे इस तरह क्यों लागू किया। क्या वास्तव में Matcher.find() का उपयोग Matcher.matches() से अधिक आम है? –
मैं नहीं कह सकता था, शायद मुझे कुछ याद आ रहा है। – Jonathan
@LukaszWiktor वास्तव में 'ढूंढ' या 'मैच' चुनना महत्वपूर्ण नहीं है क्योंकि हम रेगेक्स लिख सकते हैं जो 'केस' जैसे 'ढूंढ' को '^ 'और' $ 'के साथ अपने मामले में जोड़कर' ढूंढ' कर सकता है। [एजी] {4} $ ', या 'मिलान' जैसे 'ढूंढें' (आसपास के आह्वान) को आसपास के रेगेक्स द्वारा'। * '' * * serchedPattern। * 'के साथ करें। हो सकता है कि 'ढूंढें' चुना गया है क्योंकि यह तेज़ है, क्योंकि यह '। * Regex। *' के मामले में पूरी स्ट्रिंग पर फिर से शुरू करने के बजाय पहले मिलान करने वाले substirng को खोजने के बाद पुनरावृत्ति करना बंद कर देगा। – Pshemo