Групповой захват границ слов

Пожалуйста, постарайтесь понять свои инструменты и то, что вы делаете.

Для активации SSH на Mac выберите «Системные настройки» -> «Общий доступ» и установите флажок «Удаленный вход».

Диспетчер команд/пакетов aptпредназначен для систем Linux на основе Debian -.

2
26.09.2019, 10:59
1 ответ

Проблема в том, что \1относится к совпавшему тексту, а не является регулярным выражением. В нашем случае совпадающий текст — это символ a. Поскольку \1является текстом, а не регулярным выражением, ему все равно, что следует за a. Соблюдайте:

$ cat file
a a
a ab
$ grep -E '(a\b) \1' file
a a
a ab

Если мы хотим, чтобы \1было словом, добавьте к нему границу слова:

$ grep -E '(a\b) \1\b' file
a a

Поскольку \1\bтребует границы слова после \1, вторая строка больше не соответствует.

Чтобы продемонстрировать, что \1не является регулярным выражением, давайте попробуем:

$ echo '.a' | grep -E '(.)\1'
$ 

Но:

$ echo '..' | grep -E '(.)\1'
..
$ 

Таким образом, \1соответствует .. В то время как .обычно является активным регулярным выражением -и соответствует любому символу, \1будет соответствовать только точке.

Документация

Из руководства GNU grep:

The back-reference ‘\n’, where n is a single digit, matches the substring previously matched by the nth parenthesized subexpression of the regular expression. For example, ‘(a)\1’ matches ‘aa’. When used with alternation, if the group does not participate in the match then the back-reference makes the whole match fail. For example, ‘a(.)|b\1’ will not match ‘ba’. When multiple regular expressions are given with -e or from a file (‘-f file’), back-references are local to each expression. [emphasis added.]

3
27.01.2020, 22:02

Теги

Похожие вопросы