2012-02-14 8 views
44

मैं इस regex जब मैं PHP में इसका परीक्षण काम कर रहा है, लेकिन यह उद्देश्य सी में काम नहीं करता है:उद्देश्य सी (NSRegularExpression) में नियमित अभिव्यक्ति कैसे लिखें?

(?:www\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\.?((?:[a-zA-Z0-9]{2,})?(?:\.[a-zA-Z0-9]{2,})?) 

मैं बच पात्रों भागने की कोशिश की लेकिन है कि या तो मदद नहीं करता है। क्या मुझे किसी अन्य चरित्र से बचना चाहिए?

इस उद्देश्य सी में मेरी कोड है:

NSMutableString *searchedString = [NSMutableString stringWithString:@"domain-name.tld.tld2"]; 
NSError* error = nil; 

NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"(?:www\\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\\.?((?:[a-zA-Z0-9]{2,})?(?:\\.[a-zA-Z0-9]{2,})?)" options:0 error:&error]; 
NSArray* matches = [regex matchesInString:searchedString options:0 range:NSMakeRange(0, [searchedString length])]; 
for (NSTextCheckingResult* match in matches) 
{ 
    NSString* matchText = [searchedString substringWithRange:[match range]]; 
    NSLog(@"match: %@", matchText); 
} 

- अद्यतन -

इस regex रिटर्न (PHP में) मूल्यों के साथ "डोमेन नाम" और "tld.tld2" सरणी लेकिन उद्देश्य सी में मैं केवल एक ही मूल्य प्राप्त: "डोमेन-name.tld.tld2"

- अद्यतन 2 -

इस regex अर्क 'डोमेन नाम' और 'टीएलडी' स्ट्रिंग से:

  • domain.com = (डोमेन, कॉम)
  • domain.co.uk = (डोमेन, co.uk)
  • -Test-domain.co.u = (परीक्षण डोमेन, सह)
  • -Test-domain.co.uk- = (परीक्षण डोमेन, co.uk)
  • -test-domain.co.uk = (परीक्षण डोमेन, सह)
  • -Test-domain.co- एम = (परीक्षण-डोमेन)
  • -test-domain-.co.uk = (परीक्षण-डोमेन)

यह मान्य डोमेन नाम लेता है (शुरू नहीं होता है या '-' और 2 से 63 अक्षरों के बीच समाप्त नहीं होता है), और यदि टीएलडी के दो हिस्सों तक मान्य होते हैं तो भागों को मान्य किया जाता है (कम से कम दो अक्षर लंबे अक्षरों वाले होते हैं और संख्या)

आशा है कि यह स्पष्टीकरण मदद करता है।

+0

ईमेल सत्यापन? – Hiren

+0

शायद यह मदद करता है? http://stackoverflow.com/questions/5478170/regular-expression-in-ios – dom

+2

मुझे लगता है कि डिनो पूछ रहा है कि मौजूदा रेगेक्स को ObjectiveC कोड में कैसे परिवर्तित करें। इससे कोई फर्क नहीं पड़ता कि रेगेक्स क्या करता है। –

उत्तर

70

NSTextCheckingResult में अनुक्रमणित करके कई आइटम प्राप्त किए गए हैं।

[match rangeAtIndex:0]; पूरा मिलान है।
[match rangeAtIndex:1]; (यदि यह मौजूद है) पहला कैप्चर समूह मैच है।
आदि

आप कुछ इस तरह का उपयोग कर सकते हैं:

NSString *searchedString = @"domain-name.tld.tld2"; 
NSRange searchedRange = NSMakeRange(0, [searchedString length]); 
NSString *pattern = @"(?:www\\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\\.?((?:[a-zA-Z0-9]{2,})?(?:\\.[a-zA-Z0-9]{2,})?)"; 
NSError *error = nil; 

NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern: pattern options:0 error:&error]; 
NSArray* matches = [regex matchesInString:searchedString options:0 range: searchedRange]; 
for (NSTextCheckingResult* match in matches) { 
    NSString* matchText = [searchedString substringWithRange:[match range]]; 
    NSLog(@"match: %@", matchText); 
    NSRange group1 = [match rangeAtIndex:1]; 
    NSRange group2 = [match rangeAtIndex:2]; 
    NSLog(@"group1: %@", [searchedString substringWithRange:group1]); 
    NSLog(@"group2: %@", [searchedString substringWithRange:group2]); 
} 

NSLog उत्पादन:

मैच: डोमेन-name.tld.tld2
डोमेन नाम
टीएलडी।tld2

परीक्षण करें कि मिलान सीमाएं मान्य हैं।

बस इस मामले में अधिक:

NSString *searchedString = @"domain-name.tld.tld2"; 
NSRange searchedRange = NSMakeRange(0, [searchedString length]); 
NSString *pattern = @"(?:www\\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\\.?((?:[a-zA-Z0-9]{2,})?(?:\\.[a-zA-Z0-9]{2,})?)"; 
NSError *error = nil; 

NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error]; 
NSTextCheckingResult *match = [regex firstMatchInString:searchedString options:0 range: searchedRange]; 
NSLog(@"group1: %@", [searchedString substringWithRange:[match rangeAtIndex:1]]); 
NSLog(@"group2: %@", [searchedString substringWithRange:[match rangeAtIndex:2]]); 

स्विफ्ट 3.0:

let searchedString = "domain-name.tld.tld2" 
let nsSearchedString = searchedString as NSString 
let searchedRange = NSMakeRange(0, searchedString.characters.count) 
let pattern = "(?:www\\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\\.?((?:[a-zA-Z0-9]{2,})?(?:\\.[a-zA-Z0-9]{2,})?)" 

do { 
    let regex = try NSRegularExpression(pattern:pattern, options: []) 
    let matches = regex.matches(in:searchedString, options:[], range:searchedRange) 
    for match in matches { 
     let matchText = nsSearchedString.substring(with:match.range); 
     print("match: \(matchText)"); 

     let group1 : NSRange = match.rangeAt(1) 
     let matchText1 = nsSearchedString.substring(with: group1) 
     print("matchText1: \(matchText1)") 

     let group2 = match.rangeAt(2) 
     let matchText2 = nsSearchedString.substring(with: group2) 
     print("matchText2: \(matchText2)") 
    } 
} catch let error as NSError { 
    print(error.localizedDescription) 
} 

प्रिंट उत्पादन:

मैच: डोमेन-name.tld.tld2
matchText1: डी omain नाम
matchText2: tld.tld2

अधिक बस इस मामले में:

do { 
    let regex = try NSRegularExpression(pattern:pattern, options: []) 
    let match = regex.firstMatch(in:searchedString, options:[], range:searchedRange) 

    let matchText1 = nsSearchedString.substring(with: match!.rangeAt(1)) 
    print("matchText1: \(matchText1)") 

    let matchText2 = nsSearchedString.substring(with: match!.rangeAt(2)) 
    print("matchText2: \(matchText2)") 

} catch let error as NSError { 
    print(error.localizedDescription) 
} 

प्रिंट उत्पादन:

matchText1: डोमेन नाम
matchText2: tld.tld2

+0

वर्तमान में मेरे ऊपर दिए गए कोड सभी मिलान किए गए परिणाम (पूर्ण मिलान, डोमेन-नाम, टीएलडी) प्रदर्शित करते हैं और जब मैं उस रेगेक्स ऑनलाइन का परीक्षण करता हूं तो यह काम करता है लेकिन जब उद्देश्य सी – budidino

+0

में परीक्षण किया जाता है तो यह केवल पहला मान (पूर्ण मिलान) देता है मुझे "NSMutableString stringWithString" भाग में कोई समस्या है क्योंकि रेगेक्स एक ही चीजों से मेल नहीं खाता है वीएस उद्देश्य सी – budidino

+1

मुझे खेद है, आप सही थे। ऐसा लगता है कि मुझे समझ में नहीं आया कि परिणाम कैसे प्राप्त करें। मैं अपने कोर और ऑब्जेक्टिव सी पर एक वेब डेवलपर हूं, जो कुछ भी मैं PHP में कम से कम 2 गुना कठिन करने की कोशिश करता हूं :) धन्यवाद। – budidino

11

Apple's documentation के अनुसार, इन अक्षरों (\ का प्रयोग करके) उद्धृत किया जाना चाहिए शाब्दिक रूप में व्यवहार किया जाना चाहिए:

* ? + [ () { }^$ | \ ./

यह भी अगर आप समझा सकता है कि आप क्या हासिल करने की कोशिश कर रहे हैं मदद मिलेगी। क्या आपके पास कोई टेस्ट फिक्स्चर है?

+0

मानक regex भावना में? या रेगेक्स ऑपरेटरों के रूप में माना जा सकता है? –

+0

मैं obj-c में regex का प्रयास कर रहा हूं, लेकिन मुझे काम करने के लिए \ \ '' प्राप्त नहीं हो सकता है। कोई विचार? – ZuluDeltaNiner

+10

आपको बैकस्लैश से पहले भागना होगा। \\\ [ –

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