2012-11-18 15 views
8

मैं this CodingBat problem हल करने के लिए कोशिश कर रहा हूँ: अगर दिए गए स्ट्रिंग "xyz" जहां xyz सीधे द्वारा preceeded नहीं है की एक स्वरूप शामिलRegex केवल मेल खाते हैं, तो चरित्र शामिल नहीं है सीधे से पहले इच्छित स्ट्रिंग

वापसी सच एक अवधि (।)। तो "xxyz" मायने रखता है लेकिन "x.xyz" नहीं करता है।

xyzThere ("abcxyz") → सच
xyzThere ("abc.xyz") → झूठी
xyzThere ("xyz.abc") → सच

मैं के साथ इस हल करने की कोशिश कर रहा हूँ एक regex, लेकिन मुझे यकीन है कि where the xyz is not directly preceeded by a period आवश्यकता को संभालने के लिए कैसे अनिश्चित है।

public boolean xyzThere(String str) { 
    return str.matches(".*xyz.*"); 
} 

किसी भी विचार कैसे एक regex के साथ कहा बाधा को संभालने के लिए:

बाधा के बिना समस्या के लिए मेरे समाधान है?

+0

[नकारात्मक दिखने वाला] (http://www.regular-expressions.info/lookaround.html#lookbehind) वह है जिसे आप ढूंढ रहे हैं। लेकिन इसका उपयोग करने के लिए आपको इसके बारे में भी जानना होगा [सीमा] (http://www.regular-expressions.info/lookaround.html#limitbehind) – Pshemo

उत्तर

10

एक नकार चरित्र वर्ग चाल करना चाहिए: str.matches(".*(?:^|[^.])xyz.*")

यहाँ हम एक गैर कैप्चरिंग समूह (?:^|[^.]) उपयोग कर रहे हैं सुनिश्चित करने के लिए है कि हम स्ट्रिंग ^ के शुरू में या तो मेल खाते हैं, या किसी भी स्थिति में नहीं है अवधि [^.]

5

मैं व्यक्तिगत रूप से इस समाधान करते थे, लेकिन काफी अन्य वेरिएंट की एक संख्या देखते हैं:

str.matches("(.*[^.])?xyz.*") 

मैं सिर्फ यकीन है कि वहाँ में कुछ भी है अगर है कि xyz के सामने, तो . की अवधि तुरंत पहले नहीं होती है।

तुम भी एक lookbehind समाधान लिख सकते हैं:

str.matches(".*(?<!\\.)xyz.*"); 

(?<! ) हिस्सा नकारात्मक lookbehind, और \\. (शाब्दिक अवधि) पैटर्न है कि हम के खिलाफ जाँच करना चाहते है।

+0

@ केल्विन मैके: जावा 'मैचों' एंकर मानते हैं। – nhahtdh

+0

हालांकि, मैं कोडिंगबैट पर परीक्षण के मामलों को पास करता हूं। कृपया परीक्षा केस प्रदान करें जो कोड को विफल करता है। – nhahtdh

+0

@ केल्विन मैके: बात यह है कि मैंने लिखा रेगेक्स संस्करण के समतुल्य है जिसमें '^' सामने है और 'स्ट्रिंग' वर्ग में 'मैचों' की सौजन्य है। अगर एंकर नहीं मानते थे तो आपका तर्क सही होगा। – nhahtdh

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