GNU ERE正则表达式实现方案
来源:互联网 发布:淘宝直通车退款 编辑:程序博客网 时间:2024/06/04 23:03
正则表达式包括基本元素和操作符号。只使用基本元素可以构造简单的正则表达式;使用基本元素和操作符号可以构造复杂的正则表达式。
为了帮助介绍,本文接下来使用“GNU grep”命令进行实验,需要注意的是要使用“GNU grep”命令的“-E”模式,因为如果不使用该模式,那么“GNU grep”命令使用的是“GNU BRE正则表达式实现方案”;使用“-E”模式之后,“GNU grep”命令使用的才是我们介绍的“GNU ERE正则表达式实现方案”。
一、基本元素
基本元素分为“匹配位置的基本元素”,“匹配单个字符的基本元素”和“匹配一个字符集合的基本元素”。
1.1、匹配位置的基本元素
“行首位置”具体是指“紧邻换行符后面的位置”;“行尾位置”具体是指“后面紧邻换行符的位置”。我们知道,在Windows中换行符是“\r\n”,而在Linux中换行符是“\n”,那么“^,$,\<,\>”能兼容这两种情况吗?答案是经过实验可知,“^,$”不兼容两种情况,只支持“\n”换行符,“\<,\>”兼容两种情况。
具体实验过程如下:
现在有文本文件“a.txt”,内容如下:
hellolineworld
字节流形式如图1所示。
图1
有文本文件“b.txt”,内容如下:
hellolineworld
字节流形式如图2所示。
图2
分别执行grep -E '^line$' a.txt
和grep -E '^line$' b.txt
,可得结果分别如图3和图4所示,说明“^,$”不兼容,只支持“\n”换行符。
图3
图4
分别执行grep -E '\<line\>' a.txt
和grep -E '\<line\>' b.txt
,可得结果分别如图5和图6所示,说明“\<,\>”兼容。
图5
图6
“单词首尾两端位置”具体是指“单词与单词分隔符之间的位置”,单词分隔符包括“空格字符,制表符,换行符”等。
现有文本文件“c.txt”,内容如下:
hello world javaprogrammer
字节流形式如图7所示。
图7
接连执行以下命令,结果如图8所示。
grep -E '\bhello\b' c.txtgrep -E '\bworld\b' c.txtgrep -E '\bjava\b' c.txtgrep -E '\bprogrammer\b' c.txt
图8
接连执行以下命令,结果如图9所示。
grep -E '\Bhello\B' c.txtgrep -E 'hel\Blo' c.txt
图9
1.2、匹配单个字符的基本元素
1.3、匹配一个字符集合的基本元素
二、操作符号
有3类操作符号:重复操作符,选择操作符和连接操作符。3类操作符有不同的操作优先级顺序,这个优先级顺序无需记忆,只需通过“()”符号显式指定优先级即可。
另外,在正则表达式中可通过“\数字”语法来引用第几个“()”符号匹配的内容。现有文本文件“d.txt”,内容如下:
aabcabchello worldthis is a test text
执行grep -E '([a-z]{2,})\1' d.txt
命令,结果如图10所示。
图10
2.1、重复操作符
2.2、选择操作符
选择操作符是“|”。“A|B”表示的含义是:在匹配过程中,“A和B”两个正则表达式中只要有一个正则表达式匹配,那么最终结果就是匹配。
2.3、连接操作符
没有特定的符号用来表示连接操作符。将两个正则表达式放在一起就是将这两个正则表达式连接起来了。比如有正则表达式“086”和“[0-9]{11}”,将这两个正则表达式放在一起,即“086[0-9]{11}”,也就是将这两个正则表达式连接起来了。
三、转义
可以使用“\”进行特殊字符的转义。比如现有文本文件“f.txt”,内容如下:
+{}|()?
接连执行如下命令,所得结果如图11所示。
grep -E '\+' f.txtgrep -E '\{' f.txtgrep -E '\?' f.txt
图11
四、其他
正则表达式的运转跟“locale”设置息息相关。比如在有些“locale”设置中,“[a-d]”等价于“abcd”,而在有些“locale”设置中,“[a-d]”等价于“[aBbCcDd]”。又比如只在有些“locale”设置中,“\w”等价于“[0-9A-Za-z]”,“\W”等价于“[^0-9A-Za-z]”才成立。
参考文献:
[1]man grep
- GNU ERE正则表达式实现方案
- 正则表达式 BRE 与 ERE的区别
- 正则表达式之BRE与ERE字符集
- POSIX 正则表达式 BRE 与 ERE的区别
- shell学习第八天----扩展正则表达式(ERE)
- 使用GNU C正则表达式
- 随笔:linux正则表达式ERE模式中的管道符号“|”(代表or)
- ere
- ere
- GNU C用宏实现lambda表达式
- Linux操作系统实用技术总结(bash、vim、GNU make、正则表达式)
- 正则表达式识别实现
- 正则表达式简易实现
- JAVA 正则表达式实现
- java实现正则表达式
- RegexKitLite实现正则表达式
- 正则表达式算法实现
- 正则表达式Java实现
- vector--resize
- coordinatorLayout 的一个小效果
- 浅析 C++ 调用 Python 模块
- rucheng_hjp_tables
- D11
- GNU ERE正则表达式实现方案
- HDU 2120 Ice_cream's world I
- JAVA学习总结(1)
- hibernate中cascade和inverse区别
- 使用JAVA SACLA 开发 Spark SQL DataFrame IMF内部课程
- Windows系统结构的中断(1)
- haproxy redirect prefix
- ZooKeeper系列之三:ZooKeeper的安装
- 你还在用strptime来解析日期时间格式吗?Out了吧