Создание части регулярного выражения необязательно - PullRequest
1 голос
/ 28 марта 2011

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

/On.* \d{1,2}\/\d{1,2}\/\d{1,4} \d{1,2}:\d{1,2} (?:AM|PM),.*wrote:/

для соответствия:

On 3/14/11 2:55 PM, XXXXX XXXXXX wrote:

Мне нужно, чтобы это регулярное выражение также совпадало:

On 25/03/2011, at 2:19 AM, XXXXX XXXXXXXX wrote:

Итак, я попробовал это:

/On.* \d{1,2}\/\d{1,2}\/\d{1,4}(, at)? \d{1,2}:\d{1,2} (?:AM|PM),.*wrote:/

Но это ломает другие матчи

Я делаю (, в)? опционально установлено верно?

Спасибо

Ответы [ 3 ]

1 голос
/ 28 марта 2011

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

/On.* \d{1,2}\/\d{1,2}\/\d{1,4}(?:, at)? \d{1,2}:\d{1,2} (?:AM|PM),.*wrote:/ 

Сравнение результатов двух:

irb(main):023:0> s1 = "On 25/03/2011, at 2:19 AM, XXXXX XXXXXXXX wrote:"
=> "On 25/03/2011, at 2:19 AM, XXXXX XXXXXXXX wrote:"
irb(main):024:0> s2 = "On 3/14/11 2:55 PM, XXXXX XXXXXX wrote:"
=> "On 3/14/11 2:55 PM, XXXXX XXXXXX wrote:"
#Your previous Regex
irb(main):025:0> m = /On.* \d{1,2}\/\d{1,2}\/\d{1,4}(, at)? \d{1,2}:\d{1,2}(?:AM|PM),.*wrote:/
=> /On.* \d{1,2}\/\d{1,2}\/\d{1,4}(?:, at) \d{1,2}:\d{1,2} (?:AM|PM),.*wrote:/
irb(main):026:0> s1.match(m)
=> #<MatchData "On 25/03/2011, at 2:19 AM, XXXXX XXXXXXXX wrote">
irb(main):027:0> s2.match(m)
=> nil

#The updated Regex
irb(main):028:0> m = /On.* \d{1,2}\/\d{1,2}\/\d{1,4}(?:, at)? \d{1,2}:\d{1,2} (?:AM|PM),.*wrote/
=> /On.* \d{1,2}\/\d{1,2}\/\d{1,4}(?:, at)? \d{1,2}:\d{1,2} (?:AM|PM),.*wrote/
irb(main):029:0> s1.match(m)
=> #<MatchData "On 25/03/2011, at 2:19 AM, XXXXX XXXXXXXX wrote">
irb(main):030:0> s2.match(m)
=> #<MatchData "On 3/14/11 2:55 PM, XXXXX XXXXXX wrote">
0 голосов
/ 28 марта 2011

Проблема с другими входными строками может быть вызвана идиомой .*. Он жадный и хочет потреблять как можно больше от ввода.

Если ваш вход, например, это дата, за которой следует некоторый случайный текст, а затем другая дата - тогда ваше регулярное выражение будет считать, что две даты и случайный текст - это одна отдельная дата . Большая часть из этого будет потреблена .*.

В большинстве случаев лучше использовать ленивый квантификатор . Синтаксически вы пишете .*? вместо .*. У вас есть два .*. Попробуйте заменить оба на .*?

/On.*? \d{1,2}\/\d{1,2}\/\d{1,4}(, at)? \d{1,2}:\d{1,2} (?:AM|PM),.*?wrote:/

Если это не сработает, вам придется публиковать здесь даты неудач, и вы наверняка получите больше отзывов от этого сообщества.

0 голосов
/ 28 марта 2011

В обоих случаях работает следующее регулярное выражение:

On\s*\d{1,2}\/\d{1,2}\/\d{1,4}[\s,]*(at)?\s*\d{1,2}:\d{1,2}\s*(?:AM|PM),\s*.*wrote:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...