Regex для имени разбора с одним или несколькими словами после двойного числа и перед 2 или более пробелами - PullRequest
0 голосов
/ 29 января 2020

Проблема: Как создать регулярное выражение для анализа "DISNAY LAND 2.0 GCP", как имя из массива строк в Scala, например:

DE1ALAT0002  32.4756  -86.4393  106.1 ZQ DISNAY LAND 2.0 GCP             23456

//For using in code:


val regex = """(?:[\d\.\d]){2}\s*(?:[\d.\d])\s*(ZQ)\s*([A-Z])""".r . // my attempt
  val getName = row match {
    case regex(name) => name
    case _ =>
  }

Я уверен, только в:

1) между значениями имеется разное количество пробелов 2) полезное значение «DISNAY LAND 2.0 GCP» следует после двойного числа и букв «ZQ» 3) имя разделяется одним пробелом и может состоять из одного или нескольких слов 4) имя заканчивается на два или более пробела

извините, если я повторю вопрос, но после долгих поисков я не нашел правильного решения

Большое спасибо за ответы

1 Ответ

0 голосов
/ 29 января 2020

Вы можете использовать шаблон .unanchored, например

\d\.\d+\s+ZQ\s+(\S+(?:\s\S+)*)

См. Демонстрационную версию regex . Подробности

  • \d\.\d+ - 1 ди git, ., а затем 1+ цифр
  • \s+ - 1+ пробелов
  • ZQ - ZQ подстрока
  • \s+ - 1+ пробелов (здесь, определение левого контекста заканчивается, теперь, начиная собирать значение, которое мы должны вернуть)
  • (\S+(?:\s\S+)*) - Группа захвата 1:
    • \S+ - 1 или более непробельных символов
    • (?:\s\S+)* - группа без захвата, которая соответствует 0 или более последовательностям одного пробела (\s) и затем 1+ непробельных символов (например, до двойного пробела или конца строки).

Scala демо :

val regex = """\d\.\d+\s+ZQ\s+(\S+(?:\s\S+)*)""".r.unanchored
val row = "DE1ALAT0002  32.4756  -86.4393  106.1 ZQ DISNAY LAND 2.0 GCP             23456"
val getName = row match {
  case regex(name) => name
  case _ =>
}
print(getName) 

Вывод: DISNAY LAND 2.0 GCP

...