регулярное выражение в ruby ​​для строк с несколькими шаблонами - PullRequest
1 голос
/ 09 мая 2011

У меня есть строка с необязательными подстроками, и я искал / работал / для регулярного выражения с захватом имен, единственное регулярное выражение для всех если возможно.

в рублях

Пожалуйста, помогите,

пример строк:

string1 = bike wash #a simple task
string2 = bike wash @ bike point # a simple task with location
string3 = bike wash @ bike point on 13 may 11 # task with location and date
string4 = bike wash @ bike point on 13 may 11 @ 10 AM # task with location, date and time
string5 = bike wash on 13 may 11 @ 10 AM # task with date and time without location
string6 = bike wash on 13 may 11 # task and date

Я провел почти день в Google и StackOverflow, чтобы получить одно регулярное выражение для всех приведенных выше шаблонов строк.

Ответы [ 2 ]

4 голосов
/ 09 мая 2011

Допущения:

  • Местоположение и время начинаются с @, и @ больше нигде не появляется.
  • Дата начинается с on, окруженного обязательными пробелами, иon больше нигде не появляется.
  • Задача обязательна.
  • Местоположение и дата необязательны и не зависят друг от друга.
  • Время появляется только при наличии даты.
  • Задача, местоположение, дата, время отображаются только в этом порядке.

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

regex = /
  (?<task>.*?)
  (?:\s*@\s*(?<location>.*?))?
  (?:\s+on\s+(?<date>.*?)
    (?:\s*@\s*(?<time>.*))?
  )?
\z/x

string4.match(regex)
# => #<MatchData
  "bike wash @ bike point on 13 may 11 @ 10 AM"
  task:     "bike wash"
  location: "bike point"
  date:     "13 may 11"
  time:     "10 AM"
>
2 голосов
/ 09 мая 2011

Чтобы регулярное выражение выполняло эту работу, необходимо сделать некоторые предположения. Задачи не должны включать «@» или «вкл», например, но их может быть больше.

Чтобы соответствовать любому символу, кроме первого пробела для "@" или "on", я бы использовал (?! @ | on ). Таким образом, вы можете найти задачу, используя (((?! @ | on ).)+). За этим следует необязательное местоположение с префиксом «@»: (?: @ ((?:(?! on ).)+))?. Обратите внимание, что здесь не должно быть «on».

После этого указывается необязательная дата с дополнительным временем: (?: on ((?:(?! @ ).)+)(?: @ (.+))?)?. Все вместе:

((?:(?! @ | on ).)+)(?: @ ((?:(?! on ).)+))?(?: on ((?:(?! @ ).)+)(?: @ (.+))?)?

Это будет иметь задачу, местоположение, дату и время в первых четырех группах захвата. Смотрите здесь: http://regexr.com? 2tnb3

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