2012-04-20 17 views
8

ठीक है, दोस्तों। यहां एक जावा साक्षात्कार-प्रकार का प्रश्न है जो कि यहां के आसपास के कुछ बहुत ही स्मार्ट लोगों को फेंक दिया गया है। उन्हें वास्तव में उत्पादन कोड के लिए इसकी आवश्यकता है, इसलिए यह सिर्फ एक साक्षात्कार गूढ़ व्यक्ति से अधिक है।जावा रेगेक्स जो कुछ भी मेल खाता है लेकिन शाब्दिक स्ट्रिंग 'शून्य' या 'शून्य'

उन्हें जावा में एक नियमित अभिव्यक्ति की आवश्यकता है, जो सच है यदि स्ट्रिंग अक्षर 3-अक्षर शब्द शून्य के अलावा है। परीक्षण को असंवेदनशील होने की आवश्यकता है, और RegEx स्वयं को सभी काम करना चाहिए।

तो, RegEx को शून्य, शून्य, एनआईएल, एनआईएल, और अन्य को अस्वीकार कर देना चाहिए।

हालांकि, इसे स्वीकार करना चाहिए: नाइल, अनिल, इच्छा, ज़प्पा-एनआईएल-ए, और खाली स्ट्रिंग।

एक छोटे से Regex लिखने के लिए कितने जावा डेवलपर्स लेते हैं? जाहिर है बहुत!

+0

+1 उस इटालिक्स में उस भाग के लिए, आर्मचेयर ब्रोंको दोस्त। – Kaz

उत्तर

18

आप इसे negative lookahead का उपयोग करके कर सकते हैं।

केस-संवेदी विकल्प के साथ सक्षम:

^(?!nil$).* 

आप अंत में .* बंद छोड़ सकता है, तो आप वास्तव में मैच में स्ट्रिंग लौटाने की जरूरत नहीं है।

^(?![nN][iI][lL]$).* 

स्पष्टीकरण::

^  # start of string anchor 
(?!  # start negative lookahead (fail if...) 
    nil # literal characters 'nil' 
    $  # end of string 
)  # end lookahead 
.*  # consume string (not necessary, but it acts more like a typical regex) 

आप regex nil\n मैच के लिए चाहते हैं, तो \z बजाय $ अग्रदर्शी में उपयोग करें: ^(?!nil\z).*

+0

इस जलती हुई समस्या पर लीड देवों में से एक के अनुसार, आपके पहले उदाहरण^(?! nil $) में कोड। * संशोधित होने पर काम करेगा: "^ (? I) (?! nil $)। * अतिरिक्त मोर्चे पर थोड़ा जरूरी है क्योंकि हमारे पास कंपाइलर विकल्पों पर नियंत्रण नहीं है इसलिए RegEx को यह काम करना है। –

+0

इसे उत्तर के रूप में स्वीकार करना। ध्यान दें कि हमने Regex के सामने (? i) जोड़ा है, बस इसके बाद "^" –

+1

@ आर्मचेयरब्रोनको 'ध्यान दें कि हमने जोड़ा है (? I)' हां, यही कारण है कि एंड्रयू ने कहा [केस-असंवेदनशील मिलान सक्षम करें] (http://www.rexegg.com/regex-modifiers.html#i)। जावा में ऐसा करने के दो तरीके हैं: '(? I)' और 'पैटर्न .CASE_INSENSITIVE' – zx81

5
यहाँ केस-संवेदी विकल्प के बिना एक संस्करण है

यहां इसके लिए एक सच्ची नियमित अभिव्यक्ति है, जो सीधे एक सीमित automaton निर्दिष्ट करता है जिसे स्ट्रिंग के पात्रों को एक-एक करके खिलाया जा सकता है और यदि स्ट्रिंग नहीं है तो स्वीकृति स्थिति तक पहुंच जाएगी शून्य पर एक संस्करण:

(|.|..|[^Nn]..|.[^Ii].|..[^Ll]|....+) 

इस क्लासिक regex इंजन जो आस-पास देखें हैक्स को लागू नहीं करते पर काम करेंगे, और एक blazingly तेजी DFA में बदला जा सकता। (पूरी स्ट्रिंग) मैच अर्थ विज्ञान, या सबस्ट्रिंग खोज अर्थ विज्ञान:

आप ^ और $ के साथ इस एंकर करने के लिए, regex समारोह की किस तरह आप के साथ इस का उपयोग पर निर्भर करता है हो सकता है।

उदाहरण के लिए

, ग्रेप परीक्षण:

# rejects lines like nIl and NiL but accepts all else 
# including blank lines: 

grep -E '^(|.|..|[^Nn]..|.[^Ii].|..[^Ll]|....+)$' 

यहाँ विचार है कि है:

  1. लंबाई एक, दो, या चार या अधिक मैच के सभी श्रृंखलाएं।
  2. एक तीन-वर्ण स्ट्रिंग मैचों और यदि केवल:
    1. यह एन या एन से शुरू नहीं होता है; या
    2. इसमें मध्य में कोई I या i नहीं है; या
    3. इसमें अंत में एल या एल नहीं है।

शून्य और शून्य कैसे खारिज हो चुके हैं कि वे सभी तीन नियमों 2.1, 2.2 और 2.3 असफल है। एनआईएल एन के साथ शुरू होता है, इसलिए यह 2.1 में विफल रहता है। इसमें मध्य में एक है, इसलिए यह 2.2 में विफल रहता है, और इसके अंत में एल है, इसलिए यह 2.3 विफल हो जाता है।

+0

आप इसे अपने" लीड देव की "पाइप में डाल सकते हैं और उसे थोड़ी देर के लिए धूम्रपान कर सकते हैं, हाहा। :) – Kaz

+0

धन्यवाद फीडबैक, कज़। यकीन नहीं है कि वह धूम्रपान करता है, लेकिन मैं यह सुनिश्चित कर दूंगा कि उसे इस नए तम्बाकू का झटका मिल जाएगा। मैं वैकल्पिक दृष्टिकोण के साथ-साथ स्पष्टीकरण की सराहना करता हूं। –

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