[英]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.