将 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])|)"

第一个括号将字母数字字符分组,第二个括号匹配字母数字以及 -_,最后一个匹配单词末尾的字母数字。 * 意味着我们可以有第二个括号组的任何或 none,(?:) 括号为 Regex 创造匹配但不创建 backreferences/match 组的情况,并且 | 表示 OR... 所以我们可以有一个字母数字字符,然后是 0+ 个字母数字,-_,后跟另一个字母数字,或者什么都没有。 (因为 or 后面没有任何内容)

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,您想做什么。或者,如果 not 以字母数字结尾,您想做什么,例如@a-。上面的正则表达式(以及其他答案中提供的正则表达式)将匹配无效字符(例如分别为 @this@Liam_O@a)。这似乎不是对这种情况的正确处理。就个人而言,我倾向于进一步限定正则表达式以排除这些情况,但如果没有对您的业务问题进行更广泛的描述,很难说这种情况下什么是正确的。

    话虽如此,我敢打赌您可能不关心这个异常,所以您可能不会关心正则表达式中的这个缺陷。但如果您是,请告诉我们边缘情况是什么以及您希望如何处理它们,我们可以在回答中更加具体。