регулярное выражение, чтобы найти только дату из строки - PullRequest
0 голосов
/ 08 мая 2020

У меня есть строка с рисунком ниже. Я хочу только извлечь дату из строки.

199.120.110.23 - - [01/Jul/1995:00:00:01 -0400] "GET /medium/1/ HTTP/1.0" 200 6245
199.120.110.22 - - [01/Jul/1995:00:00:06 -0400] "GET /medium/2/ HTTP/1.0" 200 3985
199.120.110.21 - - [01/Jul/1995:00:00:09 -0400] "GET /medium/3/stats/stats.html HTTP/1.0" 200 4085

Ожидаемый результат

01/Jul/1995
01/Jul/1995
01/Jul/1995

В настоящее время я извлекаю в два этапа.

  1. извлекаю все, что находится в квадратных скобках. \[(.*?)\]
  2. извлекает первые 11 букв из выходной строки первого шага. ^.{1,11}

Интересно, можно ли это сделать за один шаг.

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

В Scala 2.13 учитывайте сопоставление с образцом с шаблонами интерполированных строк , для пример

List(
  """199.120.110.23 - - [01/Jul/1995:00:00:01 -0400] "GET /medium/1/ HTTP/1.0" 200 6245""",
  """199.120.110.22 - - [01/Jul/1995:00:00:06 -0400] "GET /medium/2/ HTTP/1.0" 200 3985""",
  """199.120.110.21 - - [01/Jul/1995:00:00:09 -0400] "GET /medium/3/stats/stats.html HTTP/1.0" 200 4085"""
) collect { case s"${head}[${day}/${month}/${year}:${tail}" => s"$day/$month/$year" }

выводит

res1: List[String] = List(01/Jul/1995, 01/Jul/1995, 01/Jul/1995)
1 голос
/ 08 мая 2020

Если вы еще не используете Scala 2.13, стандартные шаблоны регулярных выражений по-прежнему работают.

val dateRE = "\\[([^:]+):".r.unanchored
List(
  """199.120.110.23 - - [01/Jul/1995:00:00:01 -0400] "GET /medium/1/ HTTP/1.0" 200 6245""",
  """199.120.110.22 - - [01/Jul/1995:00:00:06 -0400] "GET /medium/2/ HTTP/1.0" 200 3985""",
  """199.120.110.21 - - [01/Jul/1995:00:00:09 -0400] "GET /medium/3/stats/stats.html HTTP/1.0" 200 4085"""
) collect { case dateRE(date) => date }
//res0: List[String] = List(01/Jul/1995, 01/Jul/1995, 01/Jul/1995)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...