2013-03-13 13 views
5

में किसी भी क्रम में 2 अक्षर से मिलान करने के लिए, मैं पैटर्न मिलान (पासवर्ड के लिए) में एक रेगेक्स बनाने की कोशिश कर रहा हूं जहां स्ट्रिंग 8 और 30 अक्षरों के बीच होनी चाहिए, कम से कम 2 होना चाहिए अंक, कम से कम 2 अक्षर (केस-असंवेदनशील), कम से कम 1 विशेष चरित्र, और कोई स्थान नहीं।रेगेक्स कम से कम 2 अंक, स्ट्रिंग

मुझे रिक्त स्थान और विशेष चरित्र मिलान करने के लिए मिल गया है, लेकिन मुझे 2 अंकों और 2 अक्षरों पर फेंक दिया गया है क्योंकि उन्हें लगातार होने की आवश्यकता नहीं है।

यानी यह a1b2c$ या ab12$ या 1aab2c$ से मेल खाना चाहिए।

अक्षरों के लिए ऐसा कुछ है?

(?=.*[a-zA-Z].*[a-zA-Z]) // Not sure. 

काम करता है नीचे यह स्ट्रिंग, लेकिन 2 पत्र लगातार कर रहे हैं और 2 नंबर consecutive..it विफल रहता है अक्षर, संख्या, विशेष वर्ण interwoven हैं केवल तभी।

(?=^.{8,30}$)((?=.*\\d)(?=.*[A-Za-z]{2})(?=.*[0-9]{2})(?=.*[[email protected]#$%^&*?]{1})(?!.*[\\s]))^.* 
+5

आप पूरी तरह यकीन है कि आप इस के लिए regexp की ज़रूरत है? – Scorpil

+0

मैं रेगेक्स के खिलाफ बहस करता हूं और केवल प्रत्येक के लिए अलग-अलग चेक करता हूं यदि कथन और स्ट्रिंग.contains() फ़ंक्शन का कुछ प्रकार है। gparyani ने एक समाधान दिया है जो regex – user1751547

+0

की तुलना में बहुत अच्छा फिट लगता है ऐसा लगता है कि मुझे रेगेक्स की आवश्यकता है क्योंकि यह एक Liferay कॉन्फ़िगरेशन का हिस्सा है। – user2166893

उत्तर

5

यदि आप नहीं चाहते हैं कि अक्षरों को लगातार (?=.*[a-zA-Z].*[a-zA-Z]) सही दृष्टिकोण होना चाहिए। उसी अंक (?=.*\\d.*\\d) या (?=(.*\\d){2}) पर जाता है।

इस regex

(?=^.{8,30}$)(?=(.*\\d){2})(?=(.*[A-Za-z]){2})(?=.*[[email protected]#$%^&*?])(?!.*[\\s])^.* 
+1

धन्यवाद। यह काम! ठीक वही जो मेरे द्वारा खोजा जा रहा था। – user2166893

+0

खुशी मैं मदद कर सकता हूं :) – Pshemo

0

मैं अपने उदाहरण है कि आप प्रदान कर रहे हैं नहीं 8 30 अक्षर

इस पैटर्न की कोशिश एक बार अगर आप चाहते हैं 8-30 अक्षर में

(?=[^\s]*[^\sa-zA-Z0-9][^\s]*)(?=[^\s]*[a-zA-Z][^\s]*[A-Za-z][^\s]*)(?=[^\s]*\d[^\s]*\d[^\s]*)[^\s]{8,30} 
1

लिए आपका अनुमान बहुत सही होगा निरीक्षण। यह माता-पिता के साथ थोड़ा और सुरुचिपूर्ण देखने के लिए बनाया जा सकता है।

(?=(.*[a-zA-Z]){2}) 

लगता है जैसे आप सही रास्ते पर हैं।

3

प्रयास करें स्ट्रिंग पार करने के लिए एक पाश का उपयोग करें:

/** 
* Checks to see if the specified string has between 8 and 30 characters, has at least 2 digits, at least 2 letters, at least one special character, and no spaces. 
* @param s the String to be checked 
* @return s, if it passes the above test 
* @throws IllegalArgumentException if it does not 
*/ 
public static String check(String s) 
{ 
    IllegalArgumentException invalid = new IllegalArgumentException(); 
    if(s.length() < 8 || s.length() > 30) 
     throw invalid; 
    int letters = 0, numbers = 0, specialChars = 0; 
    for(char c : s.toCharArray()) 
    { 
     if(c == ' ') 
      throw invalid; 
     else if(Character.isLetter(c)) 
      ++letters; 
     else if(Character.isDigit(c)) 
      ++numbers; 
     else 
      ++specialChars; 

    } 
    if(letters < 2 || numbers < 2 || specialChars < 1) 
     throw invalid; 
    return s; 
} 
+0

रेगेक्स का उपयोग करना कहीं अधिक कुशल है – Barnaby

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