首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在目标C (NSRegularExpression)中编写正则表达式?

问如何在目标C (NSRegularExpression)中编写正则表达式?
EN

Stack Overflow用户
提问于 2012-02-14 11:43:37
回答 2查看 88.2K关注 0票数 52

当我在PHP中测试这个正则表达式时,它是可以工作的,但是它在目标C中不起作用:

代码语言:javascript
复制
(?:www\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\.?((?:[a-zA-Z0-9]{2,})?(?:\.[a-zA-Z0-9]{2,})?)

我试着转义转义字符,但这也没有帮助。我应该逃避任何其他角色吗?

这是我在目标C中的代码:

代码语言:javascript
复制
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);
}

-更新--

此正则表达式返回值为"tld.tld2“和”域名“的数组(在PHP中),但在目标C中,我只得到一个值:”doma-name.tld.tld 2“。

更新2

这个正则表达式从字符串中提取‘域名’和'TLD‘:

  • example.com =(示例,com)
  • example.co.uk =(例如,co.uk)
  • -test-example.co.u =(测试-示例,co)
  • -test-example.co.uk- =(测试-示例,co.uk)
  • -test-example.co.u-k =(测试-示例,co)
  • -test-example.co-m =(测试-示例)
  • -测试-示例-.co.uk=(测试-示例)

它使用有效的域名(不以'-‘开头或以’-‘结尾,长度在2到63个字符之间),如果部分是有效的(至少有两个字符长,只包含字母和数字),则使用TLD的两个部分。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-14 12:24:46

一个NSTextCheckingResult有多个通过索引获得的项。

[match rangeAtIndex:0];是完全匹配的。

[match rangeAtIndex:1]; (如果存在)是第一个捕获组匹配。

等。

你可以使用这样的东西:

代码语言:javascript
复制
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.tld 2 域名 tld.tld2

测试匹配范围是否有效。

更简单地说,在这种情况下:

代码语言:javascript
复制
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]]);

Swift 3.0:

代码语言:javascript
复制
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.tld 2 matchText1:域名 matchText2: tld.tld2

更简单地说,在这种情况下:

代码语言:javascript
复制
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

票数 84
EN

Stack Overflow用户

发布于 2012-02-14 11:52:46

根据苹果的文档,这些字符必须被引用(使用)才能被视为文字:

代码语言:javascript
复制
* ? + [ ( ) { } ^ $ | \ . /

如果你能解释你想要达到的目标的话,这也会有帮助。你们有测试装置吗?

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9276246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档