将NSRegularExpression更新为特定模式

时间:2015-01-19 02:03:20

标签: ios regex nsregularexpression

我有一个像这样的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

2 个答案:

答案 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。这似乎不是对这种情况的正确处理。就个人而言,我倾向于进一步限定正则表达式以排除这些情况,但如果没有更广泛的业务问题描述,在这种情况下很难说什么是正确的。

    话虽如此,我打赌你可能不关心这个例外,所以正则表达式中的这个缺陷可能不会引起你的关注。但如果你是,请告诉我们边缘情况是什么以及你想如何处理它们,我们的答案可以更具体。