我有一个像这样的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
答案 0 :(得分:3)
试试这个正则表达式:
@"@[a-zA-Z0-9](?:(?:[A-Za-z0-9-_]*[a-zA-Z0-9])|)"
第一个括号对字母数字字符进行分组,第二个括号对字母数字和-
以及_
进行分组,最后一个括号在单词的末尾匹配字母数字。 *
表示我们可以拥有任何第二个括号组,(?:)
个括号为正则表达式创建匹配但不创建反向引用/匹配组的情况,|
表示OR ...所以我们可以有一个字母数字字符,然后是0 +数量的字母数字,-
和_
,然后是另一个字母数字,或者什么都没有。 (因为没有跟随或)
PS如果你需要开场@
,你的问题不太确定。如果没有,请把它拿出来......
答案 1 :(得分:1)
我会考虑以下内容:
@(?=[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
。这似乎不是对这种情况的正确处理。就个人而言,我倾向于进一步限定正则表达式以排除这些情况,但如果没有更广泛的业务问题描述,在这种情况下很难说什么是正确的。
话虽如此,我打赌你可能不关心这个例外,所以正则表达式中的这个缺陷可能不会引起你的关注。但如果你是,请告诉我们边缘情况是什么以及你想如何处理它们,我们的答案可以更具体。