簡體   English   中英

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

第一個括號將字母數字字符分組,第二個括號將字母數字字符與-_匹配,最后一個括號將單詞末尾的字母數字匹配。 *表示我們可以有第二個括號組中的任何一個,也可以不包含,括號中的(?:)會使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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM