将 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
)。这似乎不是对这种情况的正确处理。就个人而言,我倾向于进一步限定正则表达式以排除这些情况,但如果没有对您的业务问题进行更广泛的描述,很难说这种情况下什么是正确的。
话虽如此,我敢打赌您可能不关心这个异常,所以您可能不会关心正则表达式中的这个缺陷。但如果您是,请告诉我们边缘情况是什么以及您希望如何处理它们,我们可以在回答中更加具体。
我有一个像这样的 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
)。这似乎不是对这种情况的正确处理。就个人而言,我倾向于进一步限定正则表达式以排除这些情况,但如果没有对您的业务问题进行更广泛的描述,很难说这种情况下什么是正确的。话虽如此,我敢打赌您可能不关心这个异常,所以您可能不会关心正则表达式中的这个缺陷。但如果您是,请告诉我们边缘情况是什么以及您希望如何处理它们,我们可以在回答中更加具体。