2013-04-24 6 views
7

मुझे एक आवश्यकता है जो कहती है कि नाम उनके मामले को अनदेखा करने वाले 3 समान अक्षरों से शुरू नहीं होना चाहिए। एक नाम ऊपरी केस अक्षर के साथ शुरू होता है जिसके बाद लोअर केस अक्षर होते हैं।संबंधित लोअर केस अक्षर के बाद किसी भी अपरकेस अक्षर से कैसे मिलान करें?

मूल रूप से मैं पूरे नाम को ऊपरी मामले में परिवर्तित कर सकता हूं और फिर (\p{Lu})\1{3,}.* जैसे रेगेक्स से मेल खाता हूं।

लेकिन मैं सोच रहा था कि उपरोक्त आवश्यकताओं से मेल खाने वाले रेगेक्स मौजूद हैं और स्ट्रिंग के किसी प्रीप्रोकैसिंग की आवश्यकता नहीं है। तो Aa, Dd या Uu जैसे तारों से मिलान करने के लिए मैं किसी भी संभावित संयोजन को स्पष्ट रूप से निर्दिष्ट किए बिना रेगेक्स का उपयोग कर सकता हूं?

संपादित करें:
मैंने मार्कोस के जवाब को स्वीकार किया। मुझे इसे लंबाई 1 और दो के नाम से काम करने के लिए ठीक करने की आवश्यकता है और शुरुआत में इसे एंकर करना है। तो मेरे उपयोग के मामले के लिए वास्तविक regex ^(\p{Lu})(\p{Ll}?$|(?=\p{Ll}{2})(?i)(?!(\1){2})) है।

मैंने रेगेक्स में एक सबक सीखने में मेरी सहायता के लिए Evgeniy और sp00m के उत्तरों को भी ऊपर उठाया।

आपके प्रयासों के लिए धन्यवाद।

+0

'(? I) (\ p {Lu}) \ 1 {2,}। *' नहीं करेगा, लेकिन 2 को इंगित करना चाहता था, क्योंकि एक पत्र पहले से मेल खाता है। –

उत्तर

3

मैं पर बढ़ती करने के लिए स्वीकार करते हैं दिग्गजों के कंधे (यहां अन्य पोस्टर), लेकिन यह समाधान वास्तव में आपके उपयोग के मामले के लिए काम करता है:

final String[] strings = { "Aba", "ABa", "aba", "aBa", "Aaa", "Aab" }; 
final Pattern p = Pattern.compile("(\\p{Lu})(?=\\p{Ll}{2})(?i)(?!(\\1){2})"); 
for (String s : strings) System.out.println(s + ": " + p.matcher(s).find()); 

अब हमारे पास:

  1. मोर्चे पर एक upcase चार के लिए एक मैच;
  2. निम्नलिखित दो लोकेस वर्णों का एक लापरवाही दावा;
  3. एक और लुकहेड जो इन दो वर्णों पर जोर देता है वे दोनों समान नहीं हैं (मामले को अनदेखा कर रहे हैं) पहले के रूप में।

आउटपुट:

Aba: true 
ABa: false 
aba: false 
aBa: false 
Aaa: false 
Aab: true
+0

+1 यह सभी अनुरोधित आवश्यकताओं को पूरा करना चाहिए (जब ''*' अंत में जोड़ा जाता है) (मैंने प्रश्न को ठीक से नहीं पढ़ा है), मैं करूंगा अब मेरा समाधान नहीं बदला, क्योंकि आपका अब जो कुछ मिला है उससे बहुत समान है। – stema

2

कोशिश

String regex = "(?i)(.)(?=\\p{javaLowerCase})(?<=\\p{javaUpperCase})\\1"; 
    System.out.println("dD".matches(regex)); 
    System.out.println("dd".matches(regex)); 
    System.out.println("DD".matches(regex)); 
    System.out.println("Dd".matches(regex)); 

उत्पादन

false 
false 
false 
true 
+0

आशाजनक लग रहा है। 'डीसी 'जैसे तारों से मेल खाने में भी विफल रहता है। – SpaceTrucker

2

यह वही पत्र के बाद किसी भी uppercased पत्र से मेल खाता है, uppercased या नहीं:

([A-Z])(?i)\1 

इसके बाद किसी भी uppercased पत्र से मेल खाता है एक ही पत्र, लेकिन जरूरी रूप से कम किया गया:

([A-Z])(?!\1)(?i)\1 

जावा में उदाहरण के लिए,

String pattern = "([A-Z])(?!\\1)(?i)\\1"; 
System.out.println("AA".matches(pattern)); 
System.out.println("aa".matches(pattern)); 
System.out.println("aA".matches(pattern)); 
System.out.println("Aa".matches(pattern)); 

प्रिंटों

false 
false 
false 
true 
+0

इस छोटे से के लिए धन्यवाद। मैंने भी कोशिश की और यह 'एए' से मेल नहीं खाता। 'अब' से मेल खाने में भी विफल रहता है। – SpaceTrucker

+0

@ स्पेसट्रकर तो मैं वास्तव में आपको प्रश्न नहीं मिला ...यह जवाब देता है * "किसी भी संभावित संयोजन को स्पष्ट रूप से निर्दिष्ट किए बिना 'एए',' डीडी 'या' यूयू 'जैसे तारों से मेल खाने के लिए मैं किस रेगेक्स का उपयोग कर सकता हूं। लेकिन आपको 'एए' और 'अब' से भी मिलान करना होगा? – sp00m

+0

रेगेक्स 'एए' से मेल नहीं खाता है। जहां तक ​​मैंने परीक्षण किया है, आपका उत्तर सही है। – SpaceTrucker

2

एव्गेनि Dorofeev समाधान काम कर रहा है (+1), लेकिन यह सरल किया जा सकता है, केवल एक अग्रदर्शी का उपयोग कर

(\\p{Lu})(?=\\p{Ll})(?i)\\1 

(\\p{Lu}) एक अपरकेस चरित्र से मेल खाता है और इसेपर संग्रहीत करता है

(?=\\p{Ll}) सुनिश्चित करना है कि अगले वर्ण एक छोटा अक्षर है एक positive lookahead assertion है।

(?i) एक इनलाइन संशोधक है, जो केस स्वतंत्र मिलान को सक्षम बनाता है।

\\1 पहले भाग से अपरकेस अक्षर से मेल खाता है (लेकिन अब मामले में संशोधक की वजह से स्वतंत्र है)।

टेस्ट यह:

String[] TestInput = { "foobar", "Aal", "TTest" }; 

Pattern p = Pattern.compile("(\\p{Lu})(?=\\p{Ll})(?i)\\1"); 

for (String t : TestInput) { 
    Matcher m = p.matcher(t); 
    if (m.find()) { 
     System.out.println(t + " ==> " + true); 
    } else { 
     System.out.println(t + " ==> " + false); 
    } 
} 

आउटपुट:

foobar ==> झूठी
Aal ==> सच
TTest ==> झूठी

+0

इसमें केवल पहले दो वर्ण शामिल हैं (तीन होना चाहिए)। साथ ही, यह पहले दो वर्णों के लिए भी आवश्यकता को प्राप्त नहीं कर रहा है: इसे "एबी" और "एबी", "एबी", "एबी" और "एए" के लिए झूठा होना चाहिए। लेकिन फिर भी, अच्छी तकनीक के लिए मुझसे +1, मुझे लगता है कि इसे ठीक किया जा सकता है। –

+0

@stema +1 अब मुझे पता है \\ p {Ll} –

1

मैं एक आवश्यकता है जो कहती है कि नाम 3 से शुरू नहीं होना चाहिए उनके मामले को अनदेखा करने वाले समान पत्र।

आप केस-संवेदी विकल्प का उपयोग करना चाहिए: (?i)

और "बाकी-सब" \w जैसे: (?i)(\w)\1{2,}.*

या सिर्फ [a-z] जैसे: (?i)([a-z])\1{2,}.*

0

यह भावना यहाँ बना सकता है विभिन्न आवश्यकताओं के लिए अलग से जाँच करता है उपयोग करने के लिए, खासकर जब से आवश्यकता सूचियों समय के साथ बढ़ती जाती हैं।

के रूप में वर्णित आपका आवश्यकताएँ हैं:

एक नाम 3 समान पत्र उनके मामले की अनदेखी के साथ शुरू नहीं करना चाहिए

और

एक नाम का पालन एक अपर केस अक्षर से शुरू होता निचले केस अक्षरों से।

प्रत्येक के लिए एक अलग जांच (अन्य पदों में वर्णित) के लिए एक अलग जांच करने से आप उपयोगकर्ता को वास्तव में गलत बताते हुए उचित त्रुटि संदेश देने की अनुमति भी देते हैं। और यह निश्चित रूप से और अधिक पठनीय है।

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