繁体   English   中英

将NSRegularExpression更新为特定模式

[英]Updating an NSRegularExpression to be a specific pattern

我有一个像这样的NSString模式:

NSString *pattern = @"@[A-Za-z0-9]+";
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil];

此模式显示所有以@开头且后接至少一个字母数字字符的匹配项。

如何采用这种方式,以便模式匹配所有字母数字字符_或-并以字母数字字符开头和结尾?

一些例子是:

@a
@0
@a-z
@hello
@ab_z9

一些边缘情况是:

If it is @Liam_O'Flaherty then I want it to match to @Liam_O
Or
If it is @a- then I want it to match to @a

试试这个正则表达式:

@"@[a-zA-Z0-9](?:(?:[A-Za-z0-9-_]*[a-zA-Z0-9])|)"

第一个括号将字母数字字符分组,第二个括号将字母数字字符与-_匹配,最后一个括号将单词末尾的字母数字匹配。 *表示我们可以有第二个括号组中的任何一个,也可以不包含,括号中的(?:)会使Regex匹配,但不能创建反向引用/匹配组,而| 意味着OR ...所以我们可以有一个字母数字字符,然后是0+数量的字母数字-_ ,后跟另一个字母数字,否则什么也没有。 (因为没有跟随或)

PS不太确定您的问题是否需要@ 如果没有,将其取出...

我会考虑以下内容:

@(?=[A-Za-z0-9])[A-Za-z0-9-_]+(?<=[A-Za-z0-9])

其组成部分是:

  • @后面是[A-Za-z0-9-_]+是搜索的心脏,它匹配具有1个或多个字母数字字符,连字符或下划线的任何字符串。

  • 开头的前瞻性断言(?=[A-Za-z0-9])表示“但必须以字母数字开头”。

  • 结尾处的后向断言(?<=[A-Za-z0-9])表示“并且必须以字母数字结尾”。

这就提出了一些极端的问题,即:

  • 您要如何处理口音? 如果要处理带重音符号的字符(例如@naïve@resumé ,则可能要使用\\p{L}而不是A-Za-z (并且,如果将其放在代码中的字符串中,则需要转义反斜杠,以便用\\\\p{L} 。)

  • 做你想做的事,如果有是字符串中的非字母数字字符,例如什么@this.is.wrong@Liam_O'Flaherety 或者,你想,如果它以字母数字,例如到底该干什么做@a- 上述正则表达式(以及在其他的答案给出的正则表达式)将匹配于无效字符(例如@this@Liam_O ,和@a ,分别地)。 看来这可能不是对这种情况的正确处理。 就我个人而言,我倾向于进一步限定正则表达式以排除这些情况,但是如果不对您的业务问题进行更广泛的描述,则很难说出在这种情况下正确的方法。

    话虽如此,我打赌您可能不关心此异常,因此正则表达式中的此缺陷可能与您无关。 但是,如果您愿意,请告诉我们什么是极端情况,以及您希望如何处理这些极端情况,我们可以在答复中更加具体。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM