正则表达式基本是与语言无关的,只要学会正则表达式,那么基本上可以结合语言/工具与正则进行文本处理。
我们这里统一与grep来进行验证。
grep是一款Linux下按行匹配文本的工具。通常是Linux下处理文本的第一步,带有很多有用的选项。
-E:使用扩展正则匹配。
--color:将匹配到的内容进行语法高亮。
- 字符类
echo "hello world" | grep -E --color 'hell.'
echo "hello world" | grep -E --color '.'
echo "hello world" | grep -E --color 'wo[rR]ld'
echo "hello woRld" | grep -E --color 'wo[rR]ld'
echo "hello wobld" | grep -E --color 'wo[a-z]ld'
echo "hello woald" | grep -E --color 'wo[a-z]ld'
echo "hello wozld" | grep -E --color 'wo[a-z]ld'
echo "hello wogld" | grep -E --color 'wo[^a-f]ld'
echo "hello woald" | grep -E --color 'wo[^a-f]ld'
echo "hello wofld" | grep -E --color 'wo[^a-f]ld'
从上面这些测试,我们可以得出几个结论:
(1)grep采用的是贪婪匹配,匹配当前行中所有的匹配内容。
(2)grep中 [ ]采用的是前闭后闭区间。
- 数量限定符
echo "hello aaworld" | grep -E --color 'a?'
echo "hello aaaworld" | grep -E --color 'a?'
echo "hello world" | grep -E --color 'a?'
echo "hello aworld" | grep -E --color 'a+'
echo "hello aaworld" | grep -E --color 'a+'
echo "hello world" | grep -E --color 'a+'
echo "hello aworld" | grep -E --color 'a*'
echo "hello aaworld" | grep -E --color 'a*'
echo "hello world" | grep -E --color 'a*'
echo "hello world" | grep -E --color 'a{3}'
echo "hello aaworld" | grep -E --color 'a{3}'
echo "hello aaaworld" | grep -E --color 'a{3}'
echo "hello aaaaworld" | grep -E --color 'a{3}'
echo "hello world" | grep -E --color 'a{3,}'
echo "hello aaworld" | grep -E --color 'a{3,}'
echo "hello aaaworld" | grep -E --color 'a{3,}'
echo "hello aaaaworld" | grep -E --color 'a{3,}'
echo "hello world" | grep -E --color 'a{,3}'
echo "hello aaworld" | grep -E --color 'a{,3}'
echo "hello aaaworld" | grep -E --color 'a{,3}'
echo "hello aaaaworld" | grep -E --color 'a{,3}'
echo "hello aworld" | grep -E --color 'a{2,4}'
echo "hello aaworld" | grep -E --color 'a{2,4}'
echo "hello aaaworld" | grep -E --color 'a{2,4}'
echo "hello aaaaworld" | grep -E --color 'a{2,4}'
- 位置限定符
只匹配行首
echo "hello world aworld worlda aworldb world" | grep -E --color '^world'
只匹配行尾
echo "world aworld worlda aworldb world" | grep -E --color 'world$'
严格匹配一行
echo "world aworld worlda aworldb world" | grep -E --color '^world$'
echo "world" | grep -E --color '^world$'
其他
echo "world aworld worlda aworldb world" | grep -E --color '\<world'
echo "world aworld worlda aworldb world" | grep -E --color 'world\>'
echo "world aworld worlda aworldb world" | grep -E --color '\<world\>'
echo "world aworld worlda aworldb world" | grep -E --color '\bworld'
echo "world aworld worlda aworldb world" | grep -E --color 'world\b'
echo "world aworld worlda aworldb world" | grep -E --color '\bworld\b'
echo "world aworld worlda aworldb world" | grep -E --color '\Bworld'
echo "world aworld worlda aworldb world" | grep -E --color 'world\B'
echo "world aworld worlda aworldb world" | grep -E --color '\Bworld\B'
其中,\b用来限定目标串中是否有以指定字符串开头的单词,我们称之为词界。\B称之为非词界。
- 特殊符号
echo "abcabcabcdef" | grep -E --color '(abc){3}'
echo "abcabcabcabcdef" | grep -E --color '(abc){3}'
此时,( ) 表示将包含的内容作为一个整体,作为一个单元,进而可以用数量限定符来进行限定。