Обновление функции регулярного выражения Swift - PullRequest
0 голосов
/ 30 августа 2018

У меня есть следующая функция

static func replaceAtSignNotation(_ text : String) -> String {
    var source = text
    let wholePattern = "@\\[[a-z0-9-\\-]+\\]\\((\\w+)\\)"
    let typePattern = "(?<=]\\()[^)]+(?=\\))"

    if let wholeRange = source.range(of: wholePattern, options: .regularExpression) {
        if let typeRange = source.range(of: typePattern, options: .regularExpression) {
            let username = source[typeRange]
            source.replaceSubrange(wholeRange, with: "@\(username)")
        }
    } else {
        return text
    }
    return replaceAtSignNotation(source)
}

, который делает отличные шаблоны поиска работы, такие как:

@[a12-3asd-32](john) 
@[b12-32d1-23](martha)

И позволяет мне поймать имя пользователя, но некоторые имена пользователей содержат «-», например:

@[c12-12d1-13](john-user-1)

Но мое текущее регулярное выражение не фиксирует эти случаи. Любая идея, как я могу адаптировать свое регулярное выражение для управления этими делами?

1 Ответ

0 голосов
/ 30 августа 2018

Вы можете изменить первое регулярное выражение на

let wholePattern = "@\\[[a-z0-9-]+\\]\\((\\w+(?:-\\w+)*)\\)"
                                             ^^^^^^^^^^

См. Демоверсию regex .

Или, если - s может быть где угодно и может следовать друг за другом, вы также можете использовать

let wholePattern = "@\\[[a-z0-9-]+\\]\\(([\\w-]+)\\)"
                                         ^^^^^^^

См. еще одну демонстрацию регулярных выражений .

Детали

  • @\[ - буквальная @[ подстрока
  • [a-z0-9-]+ - 1+ строчные буквы ASCII, цифры или -
  • \]\( - подстрока ](
  • (\w+(?:-\w+)*) - Группа 1:
    • \w+ - 1 или более букв, цифр или _
    • (?:-\w+)* - ноль или более последовательностей
      • - - дефис
      • \w+ - 1+ слово символов
  • [\w-]+ - 1 или более слов или - символов
  • \) - ) char.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...