2011-02-10 14 views
5

मैं तुलनात्मक प्रोग्राम चला रहा हूं और मिनट में यह प्रत्यक्ष 'स्ट्रिंग-टू-स्ट्रिंग' तुलना करता है और यदि वे एक सटीक मिलान हैं तो यह आउटपुट करता है कि वे एक मैच हैं।क्या जावा में वाइल्डकार्ड चरित्र जैसी कोई चीज है?

ठीक है, मैं उदाहरण के लिए तो एक अतिरिक्त सुविधा है कि 'समानता' के लिए अनुमति दी ...

जोड़ने के लिए उम्मीद कर रहा था:

String em1 = "52494646"; 
String em2 = "52400646"; 


if (em1.equals(em2)){ 
    output.writeUTF(dir + filenames[i]); 
} 

इस कोड का एक टुकड़ा की तरह है। मुझे यह पसंद है कि यह "00" पर छोड़ देता है और अभी भी इसे 'लगभग' के रूप में पहचानता है और अभी भी इसे आउटपुट करता है।

मैं इसे String em2 = "524"+ ## +"646" कुछ ऐसा दिखाई देगा कल्पना लेकिन स्पष्ट रूप से thats सिर्फ एक अवधारणा

अगर वहाँ 'वाइल्डकार्ड' इस तरह की है करने के लिए एक तरीका है किसी को भी पता है (एक शब्द मैं uni से उठाया गया है

एसक्यूएल) या यदि इस समानता प्रकार के सौदे को करने का दूसरा तरीका है।

धन्यवाद :)

उत्तर

11

आप रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं:

if (em1.matches("524[0-9]{2}646")) { 
    // do stuff 
} 
+0

क्या यह ए-एफ हेक्स वर्णों के साथ-साथ अक्षरों के साथ भी किया जा सकता है? – user585522

+0

हां, [नियमित अभिव्यक्ति] (http://en.wikipedia.org/wiki/Regular_expression) ऐसा कर सकता है और ** बहुत अधिक ** (कुछ वास्तव में http://www.regular-expressions.info/ देखें रेगेक्स पर अच्छी जानकारी)। –

+0

और संभवतः मुझे इस रेगेक्स चीज़ को डाउनलोड करने की ज़रूरत है? या यह मानक जावा विकास किट सामान के साथ आता है? – user585522

6

आप इसे आसानी से नियमित अभिव्यक्ति का उपयोग कर हल कर सकते हैं:

if (em1.matches("524..646")) 
उदाहरण के लिए

(. एक वाइल्डकार्ड कि any character के लिए खड़ा है। आप \\d से बदलने सकता है अगर आप अंकों के वाइल्डकार्ड प्रतिबंधित करना चाहते।)

यहाँ एक अधिक सामान्य संस्करण से मेल खाता है "0" किसी भी चरित्र के खिलाफ है :

String em1 = "52494646"; 
String em2 = "52400646"; 

if (em1.matches(em2.replaceAll("0", "\\\\d"))){ 
    System.out.println("Matches"); 
} 
+1

आपकी रेटिंग मुझे मेरे पुराने कंप्यूटर की याद दिलाता है ... –

+0

+1 और मुझे वर्तमान याद दिलाता है एक, अभी तक पुराना नहीं :) – fmucar

+0

@ ring0, धन्यवाद। यह मुझे याद दिलाता है कि अब काम पर वापस आने का समय है;) – aioobe

1

आमतौर पर आप स्टार का एक संयोजन कर सकते हैं एक स्ट्रिंग के साथ शुरू होता है, समाप्त होता है या किसी अन्य स्ट्रिंग को शामिल करता है, तो यह पता चलता है कि समाप्त होता है या समाप्त होता है। आप का उपयोग करना एक नियमित अभिव्यक्ति के लिए समय की एक बेहतर विकल्प 95% होने की संभावना है लेकिन अधिक महंगा है की तरह

number.startsWith("524") && number.endsWith("646"); 

संयोजन में इन का उपयोग करता है सकते हैं।

1

नियमित अभिव्यक्ति इस तरह से आप करना चाहते हैं। आपके उदाहरण के लिए, आपको "524\\d{2}646" जैसे कुछ चाहिए। Java API for Regex देखें।

इसके अलावा यहाँ उपयोगी अपाचे कॉमन्स आईओ पुस्तकालय को देखने के बाद से यह लगता है कि आप फाइलों के साथ काम कर रहे हैं: https://commons.apache.org/proper/commons-io/javadocs/api-release/index.html?org/apache/commons/io/package-summary.html

0

ठीक है, दुर्भाग्यवश, मुझे विश्वास है कि अपाचे कॉमन्स स्ट्रिंगयूट में कोई वाइल्डकार्ड ऑपरेशन नहीं है।

अगर मुझे सही याद है, तो MySQL JDBC कनेक्टर पर एक स्ट्रिंगउल्ट्स क्लास है जिसमें वाइल्डकार्ड के साथ तारों की तुलना करने की विधि है।

-या -

आप कुछ फ़ज़्ज़ तर्क का उपयोग कर प्रयास कर सकते हैं: http://jfuzzylogic.sourceforge.net/html/index.html

1

मुझे लगता है कि ऊपर उल्लिखित आरई समाधान के साथ समस्या यह है कि आप संख्याओं कि समान हैं में कोई दिलचस्पी नहीं कर रहे हैं है, लेकिन 3 के लिए या चौथी स्थिति, लेकिन संख्याओं में समान हैं लेकिन एक/दो अंकों के लिए।

जो कुछ और जटिल समस्या है, लेकिन आप मूल रूप से अपने दो तारों के लिए http://en.wikipedia.org/wiki/Hamming_distance की गणना करना चाहते हैं। बहुत सारी समस्याओं के लिए अच्छी तरह से ज्ञात एल्गोरिदम इसलिए आपको बहुत सारे उदाहरण मिलना चाहिए, लेकिन मुझे डर है कि मानक लाइब्रेरी ऐसा नहीं करेगी। इसके अलावा यह एक लूप और काउंटर के लिए है, इसलिए आपको कार्यान्वयन में कोई समस्या नहीं होनी चाहिए - आप एसटीएल का उपयोग कर सकते हैं कुछ अनुकूलन क्षमता खो देते हैं (दो तारों के पते की तुलना करना और आपको किसी भी मामले में पूरी स्ट्रिंग की तुलना करना है) लेकिन ज्यादा नहीं।

0

लोग साधारण & प्रत्यक्ष एल्गोरिदम लिखने के लिए अनिच्छुक क्यों हैं?

boolean equals(String s1, String s2, char wildcard) 

    if(s1.length() != s2.length()) 
     return false; 

    for(int i=0; i<s1.length(); i++) 
     char c1 = s1.charAt(i), c2 = s2.charAt(i); 
     if(c1!=wildcard && c2!=wildcard && c1!=c2) 
      return false; 

    return true; 
+1

शायद जेनेरिक चीजें बनाना कोड लिखने का सबसे अच्छा तरीका है। नियमित अभिव्यक्तियों का उपयोग करके हमारे पास एक बड़ी लेखन क्षमता है, लेकिन हम पढ़ने की क्षमता की एक छोटी (छोटी) कमी उत्पन्न करते हैं। लेकिन फिर भी हमें विभिन्न मामलों को संभालने के लिए एक से अधिक अभिव्यक्तियां बनाना पड़ सकता है। अस्पष्ट तर्क का उपयोग करना बहुत सामान्य है और सभी मामलों को संभाल सकता है। प्रत्यक्ष एल्गोरिदम का उपयोग करके केवल एक विशेष विशिष्ट स्थिति को संभाला जाएगा। – bluefoot

0

आप देख रहे हैं एक वाइल्डकार्ड व्यक्त करने के लिए एक अलग तरह के लिए, यहाँ एक विकल्प है:

String em1 = "52494646"; 
    String em2 = "52400646"; 

    if (em2.startsWith("524")){ 
     output.writeUTF(dir + filenames[i]); 
    } 
संबंधित मुद्दे