2016-05-05 4 views

ответ

1

Использование -P позволит PCRE, которая поддерживает lookarounds:

echo "axxxaaxx" | grep -P '(?<=x)x' 

В этом случае мы используем 'назад', что означает, что мы будем соответствовать в x, который перед ним стоит x. Это дает нам возможность иметь перекрывающиеся матчи:

Как регулярное выражение «оценены»:

xxx 
^^ 
|Cursor 
Looking for x on this position, since there is nothing this will not match 

xxx 
^^ 
|Cursor 
Looking for x on this position since it's found we got a match 

xxx 
    ^^ 
    |Cursor 
    Looking for x on this position since it's found we got a match 
+0

Спасибо. Это справедливо для этого случая, но я пытался достичь этого: Учитывая строку, верните счетчик количества раз, когда в строке появляется строка подстроки 2, а также как последние 2 символа строки, поэтому " hixxxhi "дает 1 (мы не будем считать концевую подстроку). last2 ('hixxhi') → 1 last2 ('xaxxaxaxx') → 1 last2 ('axxxaaxx') → 2 – user2481458

2

grep оленья кожа поддержка перекрывающихся согласование регулярных выражений. Он потребляет символы, которые совпадают. В этом случае вы можете включить Perl Compatible Regex (PCRE), используя -p переключатель и использовать положительный взгляд вперед утверждение так:

$ echo "axxxaaxx" | grep -oP "x(?=x)" 
x 
x 
x 
$ echo "axxxaaxx" | grep -oP "x(?=x)" | wc -l 
3 
$ 

regex(?=regex2) Положительных смотреть вперед утверждение находит все regex1, после чего regex2 следующим образом. При совпадении символов для regex2 он НЕ потребляет символы, поэтому вы получаете 3 матча.

x(?=x) Позитивный взгляд вперед утверждение находит все x, что имеет x после него.

В строке xxx, 1-й x матчи, потому что он имеет x после него, второй x тоже и третий x нет.

Более подробную информацию и легко можно найти примеры here

+1

Можете ли вы объяснить, что магия (= х?) Делает? – user2481458

+0

Это раздел подкатегории http://stackoverflow.com/questions/37050030/no-of-occurences-of-patterns-in-string/37050288#37050288 – user2481458

Смежные вопросы