Regex для переупорядоченных символов данной строки - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь найти регулярное выражение, соответствующее переупорядоченной строке 0046711766. Итак, ровно два 0, два 1, один 4, три 6 и два 7 в любом порядке. После поиска StackOverflow я сделал это

(?=([^0]*0){2}) (?=([^1]*1){2}) (?=([^6]*6){3}) (?=([^7]*7){2}) (?=.*4) [01467]{10}

, который, кажется, делает работу. Но у меня не было опыта работы с позитивными взглядами, и, вероятно, есть более эффективный способ сделать это. Насколько я понимаю, самое ограниченное из моих условий на самом деле в конце, что плохо для применения такого поиска в базе данных.

1 Ответ

0 голосов
/ 06 ноября 2018

Это правда, что наиболее ограничивающее условие в настоящее время находится в конце, но если бы оно было в начале, вы бы не смогли использовать утверждения с предварительным просмотром (вместо этого вам понадобятся утверждения с обратным взглядом).

Но утверждения за кадром должны быть fixed-width (есть некоторые исключения, например, в Java), поэтому вы не можете использовать их здесь.

Однако есть одна вещь, которую вы могли бы сделать, - это использование прогнозного утверждения для основного условия.

Итак, это ваше текущее решение с небольшими улучшениями ( demo ):

(?=([^0]*0){2})(?=([^1]*1){2})(?=[^4]*4)(?=([^6]*6){3})(?=([^7]*7){2})[01467]{10}

И это версия с дополнительным прогнозом ( демо ) ( редактировать: Я сделал группы внутри прогнозирования без захвата ):

(?=[01467]{10})(?=(?:[^0]*0){2})(?=(?:[^1]*1){2})(?=[^4]*4)(?=(?:[^6]*6){3})(?=(?:[^7]*7){2}).{10}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...