2009-01-06 17 views
13

जावास्क्रिप्ट में एक नियमित अभिव्यक्ति परिभाषित कर चुकी है और अब उपयोगकर्ता एक स्ट्रिंग में टाइप कर रहा है या नहीं। मैं उसे बताना चाहता हूं कि यदि उसकी स्ट्रिंग अभी भी टाइपिंग जारी रखती है या यदि वह पहले से ही गलत तरीके से है तो उसकी स्ट्रिंग RegExp से मेल खा सकती है। उदाहरण के लिए:जांचें कि स्ट्रिंग जावास्क्रिप्ट RegExp

var re = /a*b/; 

"a".isPrefixOf(re); // true 
"x".isPrefixOf(re); // false 

कैसे isPrefixOf के एक कार्यान्वयन दिखाई दे सकता है?

अपडेट: ब्रैड द्वारा सुझाए गए रेगेक्स उपसर्ग-सबूत को बनाने के लिए धन्यवाद, एक अच्छा कामकाज प्रतीत होता है। लेकिन मैं अभी भी एक सामान्य समाधान खोजने की कोशिश कर रहा हूं।

शायद इस तरह: हम उपयोगकर्ता इनपुट के साथ .* के साथ एक नया regex बनाते हैं। यह regex उन सभी शब्दों का वर्णन करता है जो उपयोगकर्ता अभी भी दर्ज कर सकते हैं। यदि इस निर्मित रेगेक्स का चौराहे और मूल regex खाली है तो उपयोगकर्ता पहले से ही गलत तरीके से है। यदि ऐसा नहीं है, तो वह ठीक कर रहा है। उदाहरण के लिए:

var re = /a*b/; 
var sInput = "a"; 
var reInput = new RegExp(sInput + ".*"); 

reIntersection = re.intersect(reInput); 
reIntersection.isEmpty(); // false 

intersect() एक नया regex कि केवल शब्द है जो दोनों re और reInput स्वीकार करेंगे स्वीकार करता है देता है। समारोह अभी तक मौजूद नहीं है, लेकिन हम देखो आगे का उपयोग कर इसे लागू कर सकते हैं:

RegExp.prototype.intersect = function(pattern2) { 
    return new RegExp('(?=' + this.source + ')' + pattern2.source); 
} 

क्या खुला रहता है isEmpty() कार्य है। अगर हम जावास्क्रिप्ट रीगेक्स किसी भी शब्द से मेल खाते हैं या यह खाली है तो हम कैसे जांच सकते हैं?

उत्तर

-1

सबसे पहले आप अपनी नियमित अभिव्यक्ति को परिभाषित करते हैं: var re = new RegExp (/^(regexp यहां) $ /); - जहां पाठ स्ट्रिंग में प्रवेश किया है

text.match (regexp):

onKeypress घटना पर

, तो आप इस तरह regexp की जाँच करें।

क्या यह स्पष्ट है? ऐसा करने का

+1

आपको प्रश्न को और सावधानी से पढ़ना चाहिए। यह Matcher को कॉल करने के लिए नहीं पूछता है। यह पूछता है कि कैसे matcher लिखना है। – user51568

-1

एक तरह से एक पाठ बॉक्स की onkeyup घटना और .test नियमित अभिव्यक्ति के खिलाफ पाठ को हुक करने की हो सकती है। मेरी धारणा निश्चित रूप से है कि आप एक नियमित अभिव्यक्ति मिलान करना चाहते हैं। मुझे यकीन है कि अगर यह वास्तव में क्या आप वास्तव में जरूरत है, अपने कोड है नहीं कर रहा हूँ:

"a".isPrefixOf(re); // true 

से मेल खाते हैं कभी नहीं होगा क्योंकि यह भी बाद में एक "बी" चरित्र के लिए आवश्यक है (यदि आप नियमित रूप से संशोधित करने के लिए चाहते हो सकता है अभिव्यक्ति)। उदाहरण के लिए, इस कोड को किसी भी स्ट्रिंग मिलान के खिलाफ इस प्रारूप का परीक्षण होगा:

a-n(n)-b 

यहाँ कोड है, एक पेज के रूप में सहेज और अपने ब्राउज़र में लोड:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="it"> 
<body> 
    <input type="text" size="20" id="txtData" onkeyup="showResult()" /> 
    <div id="dvResult" /> 
</body> 
</html> 
<script type="text/javascript"> 
//<![CDATA[ 

    theRegExp = /^a\-\d{1,2}\-b$/; 

    function isPrefixOf(aText, aRegExp) 
    { 
     return aRegExp.test(aText); 
    } 

    function showResult() 
    { 
     res = document.getElementById("dvResult"); 
     res.innerHTML = isPrefixOf(document.getElementById("txtData").value, theRegExp) ? "Correct" : "Bad input"; 
    } 

//]]> 
</script> 
+0

आपको प्रश्न को और सावधानी से पढ़ना चाहिए। यह Matcher को कॉल करने के लिए नहीं पूछता है। यह पूछता है कि कैसे matcher लिखना है। – user51568

+0

यही कारण है कि मैंने उस नोट को बोल्ड टेक्स्ट में हाइलाइट किया! – Manuel

+0

हालांकि सवाल बेहतर phrased किया जा सकता था, मुझे लगता है कि समझना मुश्किल नहीं है। आप मुझे क्या वोट देना चाहते हैं? – user51568

2

बहुत दिलचस्प सवाल है। मेरी त्वरित खोज में, मुझे कुछ भी पूर्वनिर्धारित नहीं मिला (पर्ल में भी नहीं) जो इस समस्या को हल करता है।

संपादित करें: आउच, ऐसा लगता है जावा समान hitEnd बुलाया कुछ है() - एलन एम के जवाब देखें। क्या हिटएंड() कहता है कि मिलान() (या तो सत्य या गलत) का परिणाम अतिरिक्त इनपुट द्वारा संशोधित किया जा सकता है।'मास्टरिंग रेग्युलर एक्सप्रेशन' किताब कहती है कि यह बहुत भरोसेमंद नहीं है (सुनिश्चित नहीं है कि पृष्ठ 3 9 2 Google पुस्तकें में क्यों उपलब्ध नहीं है)

नियमित अभिव्यक्तियों की विशेषताओं के आधार पर, एक त्वरित हैक जैसे कुछ प्रकार के उपसर्ग लिखना अपने regexp की:

के लिए एक + एक * बी + सी अपने उपसर्ग हो जाएगा

जैसे:।

 
a+ 
a+a* 
a+a*b+ 
a+a*b+c 

और अपने स्ट्रिंग काम हो सकता है के साथ उनमें से किसी से मेल करने की कोशिश यह त्वरित हैक मुश्किल अगर तुम किया जाता है यदि आप श्रेणी ऑपरेटर {n, m} या बैक-रेफरेंस का उपयोग करते हैं, तो विकल्प ऑपरेटर का उपयोग करें।

कहा जा रहा है कि, मुझे लगता है कि अच्छा समाधान मिलान करने वाले एल्गोरिदम को थोड़ा संशोधित करना है।

आम तौर पर नियोजित मिलान करने वाला एल्गोरिदम एक बैकट्रैकिंग एल्गोरिदम है (जो अभ्यास में अच्छी तरह से काम करता है, भले ही सबसे खराब केस व्यवहार घातीय हो)। यह एल्गोरिदम सफलतापूर्वक समाप्त हो जाता है जब भी यह regexp के अंत तक पहुंच जाता है (भले ही पूरी स्ट्रिंग खपत न हो)। आपको क्या करना है, समाप्ति की स्थिति को संशोधित करना है, जैसे कि यह सभी इनपुट का उपभोग करने पर सफलतापूर्वक समाप्त हो जाता है।

कहा जा रहा है कि, आपको वास्तव में जावास्क्रिप्ट में एल्गोरिदम लागू करना होगा। उम्मीद है कि यह jquery जैसे पुस्तकालयों का हिस्सा बन जाएगा।

अधिक संदर्भ और एल्गोरिथ्म पर सिद्धांत के लिए, इस लेख पढ़ें:

http://swtch.com/~rsc/regexp/regexp1.html

(भले ही वह बैक ट्रैकिंग एल्गोरिथ्म के खिलाफ मामला बना देता है और एक एफए आधारित एल्गोरिथ्म पता चलता है (लेकिन एफए संभाल सकते हैं बैक संदर्भ))।

3

मुझे लगता है कि यहां आपकी सबसे अच्छी शर्त है कि आपका रेगेक्स उपसर्ग-सबूत बनाना है। उदाहरण के लिए, /a*b/, मुझे लगता है कि आप शायद /a*b?/.test(userinput) का उपयोग कर सकते हैं। अधिक जटिल पैटर्न के लिए यह तेजी से कठिन हो सकता है, लेकिन मुझे अभी भी लगता है कि यह वैकल्पिक क्वांटिफ़ायर (?) की श्रृंखला में प्रत्येक सबएक्सप्रेस को घोंसले से किया जा सकता है। उदाहरण के लिए:

/a*bcd*e/ 

उपसर्ग regex हो सकता है:

/a*(b(c(d*e?)?)?)?/ 

इसके थोड़ा जटिल है, बल्कि अच्छी तरह से मुझे लगता है कि आपकी समस्या का समाधान होगा।

+0

यह एक अच्छा विचार है (आपको एक वोट मिलता है), लेकिन मुझे लगता है कि अधिक जटिल पैटर्न के लिए जल्दी टूट जाता है। निम्नलिखित पैटर्न के लिए आप उपसर्ग रेगेक्स कैसे बनाएंगे?/ए (बीसी | बीसी) डी/ – Prestaul

4

लोग इस प्रश्न की व्याख्या कैसे करते हैं, इस पर समान रूप से विभाजित होने लगते हैं, इसलिए मैं जावा उदाहरण के साथ अवधारणा का प्रदर्शन करूंगा।

import java.util.regex.*; 

public class Test 
{ 

    public static void main(String[] args) throws Exception 
    { 
    tryMatch("^a*b+$", "a", "ab", "abc"); 
    } 

    public static void tryMatch(String regex, String... targets) 
    { 
    Pattern p = Pattern.compile(regex); 
    Matcher m = p.matcher(""); 
    System.out.printf("%nregex: %s%n", regex); 
    System.out.printf("target | matches() | hitEnd()%n"); 
    for (String str : targets) 
    { 
     m.reset(str); 
     System.out.printf("%-6s | %-9B | %-9B%n", 
      str, m.matches(), m.hitEnd()); 
    } 
    } 
} 

उत्पादन:

regex: ^a*b+$ 
target | matches() | hitEnd() 
a  | FALSE  | TRUE 
ab  | TRUE  | TRUE 
abc | FALSE  | FALSE 

लक्ष्य स्ट्रिंग "एक" से मेल नहीं खाता क्योंकि regex कम से कम एक b आवश्यकता है, लेकिन यह एक सफल मैच का उपसर्ग, तो hitEnd() रिटर्न true हो सकता है। स्ट्रिंग "एबी" में एक मैच के लिए आवश्यक सभी चीजें हैं, लेकिन अगर हम b के अंत तक जोड़ते हैं तो यह भी मेल खाता है, इसलिए hitEnd() अभी भी true लौटाता है। "Abc" के साथ मिलान प्रयास लक्ष्य स्ट्रिंग के अंत तक पहुंचने से पहले विफल हो जाता है, इसलिए regex "abc" से शुरू होने वाली किसी भी स्ट्रिंग से मेल नहीं खा सकता है।

जहां तक ​​मुझे पता है, जावास्क्रिप्ट में जावा की hitEnd() विधि जैसी कोई चीज़ नहीं है, लेकिन नकली इसे संभव हो सकता है। अगर कोई जानता है कि यह कैसे होगा, फ्लैगेंट बैडस, Steven Levithan

+0

हिट एंड के लिए एक अच्छा संदर्भ के लिए upvoted – user51568

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