Как упростить регулярное выражение, не переписывая одну и ту же группу захвата? - PullRequest
0 голосов
/ 02 марта 2019

Вводимый текст:

С понедельника по пятницу 6:00 до 20:00

С субботы по воскресенье С 6:30 до 20:00.

Мне нужно сопоставить текст, выделенный полужирным шрифтом, чтобы получить следующее регулярное выражение:

(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday) (to) (Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)

Как мне упростить регулярное выражениеизбегая перезаписи группы захвата (Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday) дважды?

Ответы [ 4 ]

0 голосов
/ 02 марта 2019

Если ваш поисковый текст содержит данные только в формате: ежедневно с 6:00 до 20:00, вы можете использовать

re.findall("([A-Za-z]*day)\s(to)\s([A-Za-z]+day)","Monday to Tuesday  6:00 a.m. to 8:00 p.m")
0 голосов
/ 02 марта 2019

Это короче, но и более уродливо:

((?:(?:Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)day)(?: to )?)+

Хотя оно соответствует чему-то вроде Monday Friday (без to).

Я бы определенно остался сСамая большая версия, для удобства чтения.

0 голосов
/ 02 марта 2019

Если можно сделать следующие предположения:

  • Вам не нужны отдельные захваты после того, как матч был сделан
  • Шаблон должен появиться в начале 1007 * от ввода

Тогда вы можете сделать:

^\b(( to |^)(Monday|Tuesday)){2}\b

Объяснение

  • ^ соответствует началу ввода.
  • \b требует, чтобы первый символ был словом-символом.Он предназначен для предотвращения совпадения «в» в начале строки.
  • {2} требует, чтобы основная часть совпадала дважды подряд
  • ( to |^) теоретически может совпадать либо с«to» или начало ввода, но поскольку мы впервые знаем, что мы находимся в начале (из-за первого ^), и оно не может совпадать с «to» из-за предыдущего \b, этобез операции тогда.Во второй раз он больше не может совпадать с началом ввода, так как мы уже сопоставили один день, так что только «to» может соответствовать на второй итерации.
  • \b в конце естьИзбегайте совпадения с чем-то вроде Tuesdaymorning.
0 голосов
/ 02 марта 2019

Вы можете определить чередование фрагмента строки, а затем использовать его:

var input = "Monday to Friday 6:00 a.m. to 8:00 p.m.";
var alt = "(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)";
var re = new RegExp("^" + alt + " (to) " + alt + ".*$");
if (re.test(input)) {
    console.log("valid");
}
else {
    console.log("invalid");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...