Не удается получить полное имя с помощью регулярных выражений - PullRequest
2 голосов
/ 03 июня 2019

У меня есть строка ниже ...

let string = “[@he man:user:123] [@super man:user:456] [@bat man:user:789]”

Я применяю регулярное выражение, чтобы получить только такие имена, как ...

 func findMentionText2() -> [String] {
    var arr_hasStrings:[String] = []
    let regex = try? NSRegularExpression(pattern: "(@[a-zA-Z0-9_\\p{N}]*)", options: [])
    if let matches = regex?.matches(in: self, options:[], range:NSMakeRange(0, self.count)) {
      for match in matches {
        arr_hasStrings.append(NSString(string: self).substring(with: NSRange(location:match.range.location, length: match.range.length )))
      }
    }
    return arr_hasStrings
  }

И если я сделаю let hashString = string.findMentionText(), я получу [“@he”, “@super”, “@bat”]

Но то, что я хотел, было полное имя, как это ...

[“@he man”, “@super man”, “@bat man”]

Какое регулярное выражение мне нужно использовать для этого ..? Кроме того, как я могу получить идентификатор, связанный с каждым пользователем ..?

РЕДАКТИРОВАТЬ 1 ДОБАВЛЕНИЕ КАЖДОГО ЗНАЧЕНИЯ В Массив с использованием TYPEALIAS

Я объявил массив и typealias примерно так ...

typealias UserTag = (name: String, id: String)
var userTagList = [UserTag]()

А потом, добавил их в массив и распечатал каждую деталь так ...

let hashString2 = string.findMentionText2()

    for unit in hashString2 {
      let user: UserTag = (name: unit.first!, id: unit.last!)
      userTagList.append(user)

    }

    //EACH DETAIL PRINTED HERE
    for value in userTagList {
        print(value.id)
        print(value.name)
      }

Ответы [ 3 ]

3 голосов
/ 03 июня 2019

Вы можете извлечь эти подстроки, используя

"(@[^\\]\\[:]+):user:(\\w+)"

Соответствует и захватывает в Группу 1 символ @, а затем 1+ символов, отличных от ], [ и :, затем сопоставляет :user:, а затем фиксирует в Группе 2 любые символы 1+ слова , Смотрите regex demo .

В качестве альтернативы вы можете использовать

"(@\\w+(?: \\w+)*):user:(\\w+)"

См. это демо регулярных выражений . Я использую \w вместо [a-zA-Z0-9_\\p{N}], поскольку \w соответствует любой букве, цифре и _ тоже. Шаблон будет соответствовать и захватывать в Группу 1 символ @, затем 1+ символьных слов (буквы, цифры или _), затем 0 или более повторений пробела и затем 1+ символьных слов, после чего он будет соответствовать :user:, а затем включит в группу 2 любые символы в 1+ слов.

Если вы хотите сопоставить любой пробел, замените буквенное пространство на \\s.

Вот демоверсия Swift:

let string = "[@he man:user:123] [@super man:user:456] [@bat man:user:789]"
extension String {
  func findMentionText() -> [[String]] {
    let regex = try? NSRegularExpression(pattern: "(@\\w+(?: \\w+)*):user:(\\w+)", options: [])
    if let matches = regex?.matches(in: self, options:[], range:NSMakeRange(0, self.count)) {
      return matches.map { match in
            return (1..<match.numberOfRanges).map {
                let rangeBounds = match.range(at: $0)
                guard let range = Range(rangeBounds, in: self) else {
                    return ""
                }
                return String(self[range])
            }
      }
   } else {
       return []
   }
 }
}
let hashString = string.findMentionText()
print(hashString)
// => [["@he man", "123"], ["@super man", "456"], ["@bat man", "789"]]
1 голос
/ 03 июня 2019

Попробуйте с этим: (@[\\w ]+):user:(\\d+)

У вас есть демо здесь .

Имя пользователя будет в первой группе захвата. И идентификатор будет во второй группе захвата.

Пояснение:

(              # begin of first capturing group
    @          # literal @
    [          # begin of character class: It must be:
       \\w     # a-z, 0-9, underscore
       _       # and spaces (i'm using an underscore here just for make it clear)
    ]          # end of character class
    +          # repeated 1 or more
)              # end of first capturing group
:user:         # literal :user:
(\\d+)         # begin of second capturing group, 1 or more digits, end of second capturing group
0 голосов
/ 03 июня 2019

Попробуйте использовать это регулярное выражение:

@\w+( \w+)*

Как здесь - regex 101

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...