Может ли кто-нибудь объяснить это выражение по частям? grep '\([aeiou]\).\1'

Может ли кто-нибудь объяснить это выражение по частям? grep '\([aeiou]\).\1'

Я нашел это выражение для домашнего задания, которое «выведет все строки, содержащие гласную (a, e, i, o или u), за которой следует один символ, за которым снова следует та же гласная. Таким образом, оно найдет «eve» или «adam», но не «vera». Выражение работает правильно, но я ищу того, кто сможет объяснить, что делает каждая часть, чтобы я мог лучше понять, как это работает.

решение1

Прежде всего, погуглите regex sites. Они вам очень помогут. Например, попробуйте regexone.

Во-вторых, чтобы протестировать или разобраться в регулярных выражениях, обратитесь к regex101.com — это может вам очень помочь, поскольку там пошагово объясняется, что происходит; вы также можете тестировать регулярные выражения.

Теперь что касается выражения:

[aeiou]

соответствует любому из символов в скобках (здесь: a, e, i, o или u).

.

соответствует любому отдельному символу

\1

соответствует первой группе захвата.

\(anything\)

это группа захвата.

Группа захвата — это имя строки, которую вы можете запомнить для дальнейшего использования. В этом случае захват любого символа из [aeiou] позволяет нам запомнить, что мы сопоставили. Если бы мы написали это регулярное выражение вместо этого:

[aeiou].[aeiou]

у нас не было бы возможности проверить, совпадают ли первая и вторая гласные.

Итак, ваше регулярное выражение означает «Сопоставить все, что является одним из символов из «aeiou», затем любой одиночный символ, а затем первый символ».

решение2

Во-первых, \(and \). Это означает «все, что находится внутри этих экранированных скобок, является группой и может быть упомянуто как таковое позже в выражении». Внутри этого у вас есть [aeiou], что означает «любой из символов a, e, i, oили u«. Одна точка, ., означает «любой отдельный символ». The \1означает «То, что вы нашли, когда сопоставили первую группу».

Связанный контент