проблема понимания /.

У меня проблемы с пониманием / . /.*/ соответствии с тем, что написано в книгах, это печатает всю строку текста. мы знаем это . означает любой символ, а * означает ноль или более вхождений предыдущего символа. поэтому я ожидаю, что /.*/ найдет что-то вроде rrr qqqq abbbbb , я имею в виду непрерывное повторение одного символа.

но это не то, что он делает. Зачем?

Мой второй вопрос : почему / . /.+/ не делает то же самое ?? в тексте я примеряю результат есть ?

Нет, * in .* Означает «любое число предыдущего выражения », т. Е. Ноль или более любого типа символа, который соответствует выражению . ,

Это означает, что .* Будет соответствовать aaaa а также abcd поскольку все символы в abcd совпадают . , Он также будет соответствовать пустой строке, так как он допускает нулевые совпадения.

Если вы хотите найти строку, содержащую повторяющийся символ, используйте

 /\(.\)\1\1*/ 

Это выражение соответствует «любому символу, затем одному и тому же символу , а затем любому числу более одного и того же символа». Возможно, \1* можно удалить, если вы не ищете строки, содержащие только повторяющийся символ, и в этом случае вы должны привязать выражение к началу и концу строки, как в

 /^\(.\)\1\1*$/ 

Редактор ed поддерживает основные регулярные выражения. Модификатор + – это расширенный модификатор регулярного выражения. ? то, что вы получите от ed при использовании /.+/ , будет сопровождаться no match (или No match в GNU ed ), если вы включили объяснения ошибок с помощью команды H Это потому, что он пытается найти строку с + в нем, которому предшествует какой-то другой символ.

Расширенное регулярное выражение .+ («Соответствует одному или нескольким символам») эквивалентно базовому регулярному выражению ..* , то есть «соответствует символу, а затем нулю или более любого символа».

Согласно своему руководству , GNU ed должен поддерживать \+ в регулярных выражениях, так что ..* эквивалентно .\+ , Но GNU ed 1.14.2 в моей системе OpenBSD этого не делает.