2016-08-11 10 views
5

मैं एक बाधा के साथ [a-zA-Z]+ शब्दों को निकालने का प्रयास कर रहा हूं: एक शब्द में कम से कम एक कम केस अक्षर होना चाहिए और कम से कम एक ऊपरी केस अक्षर (किसी भी स्थिति में शब्द)। उदाहरण: यदि इनपुट hello 123 worLD है, तो एकमात्र मैच worLD होना चाहिए।कम से कम एक निचले केस अक्षर से मिलान करना और कम से कम एक ऊपरी केस अक्षर

मैं इस तरह सकारात्मक lookaheads का उपयोग करने की कोशिश की:

echo "hello 123 worLD" | grep -oP "(?=.*[a-z])(?=.*[A-Z])[a-zA-Z]+" 
hello 

यह सही नहीं है: केवल मैच hello बजाय worLD है।

echo "hello 123 worLD" | grep -oP "\K((?=.*[a-z])(?=.*[A-Z])[a-zA-Z]+)" 
hello 
worLD 

यह अभी भी गलत है: hello मिलान नहीं किया जाना चाहिए तो मैं यह कोशिश की।

उत्तर

4

.* लुकहेड में अक्षरों की उपस्थिति की जांच न केवल निकटवर्ती शब्द में, बल्कि बाद में स्ट्रिंग में। [a-zA-Z]* का उपयोग करें:

echo "hello 123 worLD" | grep -oP "\\b(?=[A-Za-z]*[a-z])(?=[A-Za-z]*[A-Z])[a-zA-Z]+" 

demo online

देखें मैं भी इतना है कि अग्रदर्शी जांच केवल एक शब्द सीमा के बाद प्रदर्शन किया गया था शुरू में एक शब्द सीमा \b गयी।

1

उत्तर:

echo "hello 123 worLD" | grep -oP "\b(?=[A-Z]+[a-z]|[a-z]+[A-Z])[a-zA-Z]*" 

डेमो: https://ideone.com/HjLH5o

स्पष्टीकरण:

पहले जांच कर लें शब्द एक या अधिक अपरकेस एक छोटे अक्षरों के बाद पत्र के साथ शुरू होता है या ठीक इसके विपरीत पीछा किसी भी क्रम में लोअरकेस और अपरकेस अक्षरों की किसी भी संख्या से।

प्रदर्शन:

This solution जबकि accepted solution 47 कदम उठा लेता है, बशर्ते परीक्षण स्ट्रिंग पर मैच तक पहुंचने के लिए 31 कदम उठाता है।

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