词法分析正规式
2.1编写有关正规式的调查报告
(1) grep/sed 命令对正规式的支持调查,调查与通配符的区别;
grep:
- 支持基本正则表达式(BRE)和扩展正则表达式(ERE)。
- BRE 默认支持,ERE 需要通过
-E
选项启用。
1 | grep '^[0-9]\+' file.txt # 查找以数字开头的行(BRE) |
区别:
通配符运用的场景是匹配文件名称,而正规式往往匹配文本内容
(2) 各种高级程序设计语言对正规式的支持,含 C/C++,Java、Python、Rust 与 go 等语言;
Java
在Java的 jdk 中拥有java.util.regex 包 ,可以通过实例化Pattern类调用正规式方法,以下是代码示例
1 | import java.util.regex.*; |
Python中内置了re模块
1 | import re |
(3) 常用 IDE 或编辑器对正规式的支持,如 VSCode、Visual Studio、Pycharm 等,也可选择希望的 IDE 或编辑器。
Java的集成开发环境IDEA支持:
点击查找框右侧的 .*
按钮,启用正则表达式支持。
其中包含的数据库功能模块也支持正规式查询
(4) 针对上面的每一项,建议从查找、替换与有效性验证三方面着手进行调研,必须包含浮点数(含科学计数法)的正规式,其它任选一个。
包含浮点数的科学计数法正规式为
1 | [+-]?[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)? |
.txt的为
1 | ^.*\.txt$ |
下述操作替换内容即可
查找
1.grep
1 | grep -E '[+-]?[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)?' file.txt |
2.java
1 | import java.util.regex.*; |
3.IDEA开发环境
使用 .*
选项启用正则匹配。
查找:[+-]?[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)?
替换
1.sed
使用 sed
进行替换,例如将所有匹配的浮点数替换为 [FLOAT]
:
1 | sed -E 's/[+-]?[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)?/[FLOAT]/g' file.txt |
2.java
1 | String replaced = text.replaceAll("[+-]?[0-9]+(\\.[0-9]*)?([eE][+-]?[0-9]+)?", "[FLOAT]"); |
3.IDEA开发环境
替换:输入 [FLOAT]
并点击 “全部替换”
有效性验证
1.grep sed
由于 grep
和 sed
主要用于文本处理,而非输入验证,因此它们不能直接进行严格的正则匹配验证。但是可以结合 grep -q
命令检查输入是否合法:
1 | echo "123.45e-6" | grep -qE '^[+-]?[0-9]+(\.[0-9]*)?([eE][+-] |
2.java
1 | boolean isValid = Pattern.matches("^[+-]?[0-9]+(\\.[0-9]*)?([eE][+-]?[0-9]+)?$", "123.45e-6"); |
2.2书写正规式
(1) 请写出 C 语言中无符号整数的正规式,请注意要支持 8 进制、十进制和 16 进制;
八进制:0 [0 - 7] * u?
其中的u无符号标识符是可以选择的,八进制用0来辨识
十进制:[1 - 9] [0 - 9] * u?
十六进制:0[xX] [0 - 9 a -f A - F] * u?
将所有的进制形式运用|链接形成
0 [0 - 7] * u? | [1 - 9] [0 - 9] * u? | 0[xX] [0 - 9 a -f A - F] * u?
(2) 请写出 C 语言中单行注释对应的正规式。
/ / [ ^ \n ] *
首先运用转义字符\来表示/在用后面的*匹配不等于^\n的字符