2012-01-11 19 views
8

मुझे यकीन नहीं है कि रेगेक्स यहां सबसे अच्छा समाधान हैं, लेकिन वे पर्याप्त तार्किक लगते हैं; मुझे यकीन नहीं है कि वास्तव में इसे कैसे कार्यान्वित किया जाए।बेस्ट प्रैक्टिस: आंशिक रेगेक्स मिलान

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

उदाहरण के लिए,

+(NSString *)thisIsAValid:(ObjectiveC *)method; 

एक मान्य तरीका है। इसे

[\+-]\(w+\s*\*?\)\w+....etc... 

जैसे साधारण रेगेक्स स्ट्रिंग द्वारा मिलान किया जा सकता है। लेकिन मुझे लगता है कि एक ही regex स्ट्रिंग "मैच"

+(NSStr 

(जो मुझे पता है regex का उपयोग करने का एक पीछे की ओर जिस तरह से की तरह है) करने के लिए सक्षम होने के लिए अच्छा लगेगा। मैं अभी भी नहीं रेगुलर एक्सप्रेशन से मेल करने के लिए

Q)(NStr 

वहाँ मानक regex कार्यों के साथ कुछ इस तरह लागू करने के लिए एक रास्ता है चाहेगा, या मैं और अधिक कठोर कुछ करने के लिए चाहते हैं?

बहुत बहुत धन्यवाद! आप लोग अमूल्य हैं। आम तौर पर, एक एक regex का उपयोग करता है पाठ में एक पैटर्न देखने के लिए:


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

+0

ऐसा लगता है अपने वास्तविक लक्ष्य एक पैटर्न है कि * निश्चित रूप से अमान्य * के लिए एक regex है की तरह, और फिर जब उस पैटर्न मिलान किया जाता है, जो त्रुटि पैदा करने के लिए। इस प्रकार आप भाषा के पूरक से मिलान करना चाहते हैं। ध्यान दें कि नियमित भाषा का पूरक नियमित हो सकता है या नहीं! –

+0

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

+0

+1!:-) –

उत्तर

1

रीगेक्सकिट सीईएम पीसीआरई का उपयोग करने के लिए कुछ विभाजित न करें ताकि आप सीधे पीसीआरई का उपयोग करने की कोशिश कर सकें क्योंकि इसमें आंशिक मिलान के लिए समर्थन है।

#include <stdio.h> 
#include <pcre.h> 

void test_match(pcre *re, char *subject); 

void test_match(pcre *re, char *subject) { 
    int rc = pcre_exec(re, NULL, subject, (int)strlen(subject), 
        0, PCRE_PARTIAL, NULL, 0); 
    printf("%s: %s\n", subject, 
     rc == 0 || rc == PCRE_ERROR_PARTIAL ? 
     "match or partial" : "no match"); 
} 

int main (int argc, const char * argv[]) { 
    pcre *re; 
    const char *errstr; 
    int erroffset; 

    re = pcre_compile("^ABC$", 0, &errstr, &erroffset, NULL); 
    test_match(re, "A"); 
    test_match(re, "AB"); 
    test_match(re, "ABC"); 
    test_match(re, "ABD"); 

    return 0; 
} 

प्रिंट होगा:

A: match or partial 
AB: match or partial 
ABC: match or partial 
ABD: no match 
0

मैं सिर्फ regex लेने के लिए एक स्क्रिप्ट लिखने और उसे विभाजित करें ताकि regex एबीसीडी नई regex हो जाता होगा: ^ (एबीसीडी | एबीसी | एबी | ए) $

कोष्ठक मुश्किल हो जाएगा इसलिए यदि संभव हो तो उनसे बचें। अन्यथा आपको संभवतः बंद करने वाले माता-पिता की सही मात्रा जोड़कर उस खाते के लिए जिम्मेदार होना होगा। इसके अलावा आपको regex ऑपरेटर द्वारा एबीसीडी स्ट्रिंग को टोकननाइज़ करना होगा ताकि आप कुछ * \ 0 +3

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