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