LINUX.ORG.RU
решено ФорумAdmin

Упражнения по регулярным выражениям

 , ,


2

6

Доброго времени суток!

Сел на НГ-каникулах изучать Perl и дошел счас до регулярок. Очень уж они понравились, так что хочется, чтобы они получше запомнились. Из чего 2 вопроса:

1) Встречал кто-нибудь набор тестов по регуляркам, да побольше?

2) Регулярки SEd, Perl, awk и остальных языков сильно между собой по синтаксису отличаются? Здесь тупо лень гуглить, но если память мне не изменяет, у SEd там был какой-то дополнительный изврат с заменами строк и еще набором дополнительных возможностей (или перл тоже так умеет?).

★★

Jeffrey EF. Friedl. Mastering Regular Expressions. O'Reilly
Джеффри Фридл. Регулярные выражения. СПб:Символ-плюс.
В частности, есть обзор особенностей реализации в разных языках, хотя основной упор на perl и общие для всех свойства.

ABW ★★★★★
()

.* должно хватить для всего. :-)

Mr_Alone ★★★★★
()

пункт 2. Отличаются, и не только по синтаксису но и по результату. Но вот «на сколько сильно» сложно сказать по нескольким причинам. У команд есть ключики, в зависимости от них и regex будет парсится по разному. По простому - в них есть совместимость с разными стандартами. С чего именно начинать - имхо пофиг, читаем хоть что-то, а потом остальное по мере необходимости.
Рекомендую обратить внимание на такое понятие как «жадность» многие об это споткнулись. Одно и то же выражение в случае «жадного» (привет sed) и «не жадного» (на самом деле по другому называется, но лень искать как правильно) исполнения - даст разный результат.
ЗЫ Кстати на sed есть тетрис и шахматы, когда начнете разговаривать на том коде, можете считать что достигли просветления в regex :)

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 3)

regexr.com/

regex101.com/

quiz function ed-command

qulinxao ★★☆
()

Регулярки SEd, Perl, awk и остальных языков сильно между собой по синтаксису отличаются?

Не сильно, но иногда очень внезапно отличаются. Иногда отличаются даже sed в линуксах и маках, сам сталкивался с таким.

sT331h0rs3 ★★★★★
()

http://www.grymoire.com/unix/sed.html

ну а как вполне лаконичное (с высоты птичьего полёта)

man9 regexp(https://swtch.com/plan9port/man/man7/regexp.html):



REGEXP(7)	REGEXP(7)

NAME 
regexp – Plan 9 regular expression notation
DESCRIPTION 
This manual page describes the regular expression syntax used by the Plan 9 regular expression library regexp(3). It is the form used by egrep(1) before egrep got complicated.
A regular expression specifies a set of strings of characters. A member of this set of strings is said to be matched by the regular expression. In many applications a delimiter character, commonly /, bounds a regular expression. In the following specification for regular expressions the word ‘character’ means any character (rune) but newline.
The syntax for a regular expression e0 is

e3:    literal | charclass | '.' | '^' | '$' | '(' e0 ')'

e2:    e3
       |    e2 REP

REP: '*' | '+' | '?'

e1:    e2
       |    e1 e2

e0:    e1
       |    e0 '|' e1
A literal is any non-metacharacter, or a metacharacter (one of .*+?[]()|\^$), or the delimiter preceded by \.
A charclass is a nonempty string s bracketed [s] (or [^s]); it matches any character in (or not in) s. A negated character class never matches newline. A substring a−b, with a and b in ascending order, stands for the inclusive range of characters between a and b. In s, the metacharacters −, ], an initial ^, and the regular expression delimiter must be preceded by a \; other metacharacters have no special meaning and may appear unescaped.
A . matches any character.
A ^ matches the beginning of a line; $ matches the end of the line.
The REP operators match zero or more (*), one or more (+), zero or one (?), instances respectively of the preceding regular expression e2.
A concatenated regular expression, e1e2, matches a match to e1 followed by a match to e2.
An alternative regular expression, e0|e1, matches either a match to e0 or a match to e1.
A match to any part of a regular expression extends as far as possible without preventing a match to the remainder of the regular expression.
SEE ALSO 
regexp(3)
Space Glenda

qulinxao ★★☆
()

HackerRank про качество заданий и количество точно не скажу.

impowski
()

2) Регулярки SEd, Perl, awk и остальных языков сильно между собой по синтаксису отличаются?

Открывайте http://www.regular-expressions.info/refflavors.html и смотрите в всех деталях, вкратце здесь об’яснять нечего.

sed — GNU BRE (если мы о Седе из ГНУ, разумеется), AWK — GNU ERE, Perl — таки Perl.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 2)

Вместо sed можно использовать perl -i

XXX /tmp % cat test-sed 
2
3wqe3
sdf22
XXX /tmp % perl -i -ne 's/(\d+)/$1+1/ge; print' test-sed
XXX /tmp % cat test-sed                                 
3
4wqe4
sdf23
XXX /tmp %

anonymous
()
Ответ на: комментарий от anonymous

perl -i -ne 's/(\d+)/$1+1/ge; print' test-sed

Можно заменить на

perl -i -npe 's/(\d+)/$1+1/ge' test-sed

-p добавляет в конец implying loop print.

anonymous
()
Ответ на: комментарий от anonymous

Короч, я к тому, что perl'ом легко заменить awk и sed. Другое дело, что он есть не везде. Зато если есть, то одинаковый. А то легко привыкнуть к gnu'тым sed, awk и соснуть на BSD вариантах.

anonymous
()

Всем спасибо!

aido ★★
() автор топика
Ответ на: комментарий от sT331h0rs3

Иногда отличаются даже sed в линуксах и маках

Отличается, но для простых задач не так что бы и сильно. Во всяком случае не напрягает. А вот где действительно можно попасть, так это cygwin, чего там такого я хз, но несколько раз бывало просто забивал болт и решал по другому чего ниразу не было замечено в вариантах linux - mac os x, хотя вроде должно было быть наоборот т.к. на маке bsd sed, а в linux и cygwin gnu sed.

anc ★★★★★
()

еще порекомендую книгу Damien Conway - Perl Best Practices. есть целая глава посвещенная регуляркам. рекомендую.

Nurmukh ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.