Номер матча, заканчивающийся на 1, за исключением случаев, когда заканчивается на 11 - PullRequest
0 голосов
/ 06 июня 2018

Мне нужно сопоставить любое число, заканчивающееся на 1, кроме чисел, заканчивающихся на 11. Я использую awk.Чтобы проиллюстрировать, правильно работают следующие строки:

if ( max ~ /1$/ && max !~ /11$/ ) { print max }

или с использованием регулярного выражения:

if ( max ~ /[^1]1$|^1$/ ) { print max }

или с гораздо более медленным вариантом того же регулярного выражения:

([^1]|^)1$

Я действительно подозреваю, что только эта часть (с модификацией) должна работать как-то.Это красиво, коротко и читабельно, выполняет работу намного меньше шагов, чем вышеприведенные комбинации, работает для всех чисел с 2 цифрами больше, но не для самой 1.Который я исправил выше, но предпочел бы лучший (если есть).Мне действительно нужно, чтобы он работал для 1-3-значных чисел, но я бы предпочел не ограничивать его.

[^1]1$

Как только я попробую квантификаторы исправить это, он не будет работать правильно.Он либо начинает выбирать первые 1 (например, 1211 совпадает, но не должен), либо теряет однозначное число 1 в качестве совпадения.Очевидно, моя проблема заключается в том, что я должен соответствовать концу числа.Как сделать лучшее регулярное выражение?

Контрольные примеры: Совпадающие числа:
1
21
31
121
131
1021

пропускать (не совпадать) числа, заканчивающиеся на 11, например:
11
111
211
1011
1211

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Разве вы не можете просто сделать, я полагаю, это быстрее, чем анализ регулярных выражений:

Если вы знаете, max это число:

if ( max%10 == 1 && max%100 != 11 ) { print max }

Если вы не знаетеmax - это число:

if ( max+0==max && max%10 == 1 && max%100 != 11 ) { print max }

Если вы хотите регулярное выражение, вы можете использовать ^[0-9]*[02-9]1$|^1$, но это всего лишь расширение ответа RavinderSingh13, чтобы убедиться, что это число.

0 голосов
/ 06 июня 2018

Если ваш Input_file такой же, как показанный пример, тогда вам может помочь следующее awk.

awk  '/[02-9]1$/||/^1$/' Input_file

Допустим, ниже приведен пример Input_file.

cat Input_file
1
2001
21
31
121
131
1021
11
111
211
1011
1211

Тогда будет следоватьвыводиться после запуска кода.

awk  '/[02-9]1$/||/^1$/'  Input_file
1
2001
21
31
121
131
1021
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...