Регулярное выражение для не более чем одного вхождения последовательных символов - PullRequest
0 голосов
/ 09 апреля 2020

Я ищу регулярное выражение, которое будет соответствовать только в том случае, если в строке встречаются 2 последовательных символа.

, например:

  • 1123456 - совпадение
  • 1122345 - не соответствует
  • 1121125 - не соответствует
  • 1234567 - не соответствует
  • 1112345 - не соответствует

в настоящее время имеет это регулярное выражение: ([ 0-9]) \ 1 {1,}, но также соответствует 1122345, что мне не нужно

1 Ответ

1 голос
/ 09 апреля 2020

Этот awk делает это, если у вас есть минимальный awk (mawk) или GNU awk (gawk):

awk -F "" '
{
    d=0
    for(i=1;i<NF;i++){
        if ($i==$(i+1)) d++
    }
    if (d==1) print
}' file

Установка поля в пустую строку ("") вы можете прочитать каждая строка символьно! Если символ i равен символу i+1, то увеличивается d. Если d==1, строка печатается.

Из вашего образца:

$ cat file
1123456
1122345
1121125
1234567
1112345

Выводится:

1123456

Важное замечание:

В руководстве GNU awk говорится, что использование пустой строки в качестве разделителя полей является «темным углом», что означает, что она не является стандартной, и некоторые реализации могут обрабатывать ее по-разному. Если вы хотите быть уверены, что он будет работать с любым awk, go для

awk '
{
    d=0
    n=split($0,ch,"")
    for(i=1;i<n;i++){
        if (ch[i]==ch[i+1]) d++
    }
    if (d==1) print
}' file

Он прошел тест gawk --posix и дает тот же результат.

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