регулярное выражение - сопоставление необязательно последовательных вхождений - PullRequest
0 голосов
/ 16 мая 2019

Я пытался сопоставить вхождения 0 в диапазоне от 3 до 5

Поэтому моя цель состоит в том, чтобы сопоставить все строки, содержащие от 3 до 5 0.

Пока у меня есть,

egrep '[0]{3,5}' *.txt

ожидаемый результат

20001 [действительный]

200134 [недействительный]

20103040 [допустимо]

203004038002 [недействительно]

, но это приведет к выводу строк, которые имеют только последовательные нули.

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

Ответы [ 4 ]

1 голос
/ 17 мая 2019

Входной файл:

cat file.txt
10203
1020304
102030405
10203040506
1020304050607

Команда:

egrep '^([^0]*0){3,5}[^0]*$' file.txt
1020304
102030405
10203040506

Пояснение:

^                   # beginning of line
    (               # start group
        [^0]*       # 0 or more non zero
        0           # 1 zero
    ){3,5}          # group must appear from 3 to 5 times
    [^0]*           # 0 or more non zero
$                   # end of line
1 голос
/ 16 мая 2019

Я придумал это решение, которое позволит вам проверять 3-5 0, возможно, окруженных чем-либо, кроме 0 или пробела.Надеюсь, это поможет:)

\b(?:[^0\s]*?0[^0\s]*?){3,5}\b

Если вы проверяете ТОЛЬКО строки чисел без разрывов между ними или другие символы, вы можете поменять местами \b s для ^ и $ и удалить\ s и убедитесь, что это только цифры:

^(?:[1-9]*?0[1-9]*?){3,5}$

^ соответствует началу строки, а $ соответствует концу строки.

0 голосов
/ 18 мая 2019

ERE для совпадения целых чисел, содержащих 3-5 0, если это то, что вы хотите, это ^([1-9]*0){3,5}[1-9]*$, например ::

$ grep -E '^([1-9]*0){3,5}[1-9]*$' file
20001
20103040

Разница между этим и @ ответом Тото заключается в том, что это будет совпадать только с целыми числами, в то время как @Totos будет совпадать с любыми символами с 0 с, например ::

$ echo '0 foo 0 bar 0' | grep -E '^([1-9]*0){3,5}[1-9]*$'
$ echo '0 foo 0 bar 0' | grep -E '^([^0]*0){3,5}[^0]*$'
0 foo 0 bar 0
0 голосов
/ 17 мая 2019

Регулярное выражение, которое вы ищете:

^(?!(?:.*?0){6,})(?=(?:.*?0){3,})[0-9]+$

Входной файл:

cat file.txt
20001
200134
20103040
203004038002

Команда:

Чтобы использовать регулярное выражение, я использую grep -P, потому что обратная запись (?! не поддерживается в egrep

grep -P '^(?!(?:.*?0){6,})(?=(?:.*?0){3,})[0-9]+$' file.txt
20001
20103040

Объяснение: Сначала я использую отрицательный взгляд, чтобы убедиться, что вы не можете набрать более шести символов 0 в любом месте строки. После этого я использую положительный прогноз, чтобы убедиться, что строка должна содержать не менее 3 символов 0.

^ - начало строки. И $ - это конец строки.

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