正规式调查

Uncategorized
2.3k words

词法分析正规式

2.1编写有关正规式的调查报告

(1) grep/sed 命令对正规式的支持调查,调查与通配符的区别;

grep:

  • 支持基本正则表达式(BRE)和扩展正则表达式(ERE)。
  • BRE 默认支持,ERE 需要通过 -E 选项启用。
1
2
grep '^[0-9]\+' file.txt  # 查找以数字开头的行(BRE)
grep -E '^[0-9]+' file.txt # 查找以数字开头的行(ERE)

区别:

通配符运用的场景是匹配文件名称,而正规式往往匹配文本内容

(2) 各种高级程序设计语言对正规式的支持,含 C/C++,Java、Python、Rust 与 go 等语言;

Java

在Java的 jdk 中拥有java.util.regex 包 ,可以通过实例化Pattern类调用正规式方法,以下是代码示例

1
2
3
4
import java.util.regex.*;
Pattern pattern = Pattern.compile("[+-]?[0-9]+(\\.[0-9]*)?([eE][+-]?[0-9]+)?");
Matcher matcher = pattern.matcher("123.45e-6");
boolean match = matcher.matches();

Python中内置了re模块

1
2
3
import re
pattern = re.compile(r'[+-]?[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)?')
match = pattern.match("123.45e-6")

(3) 常用 IDE 或编辑器对正规式的支持,如 VSCode、Visual Studio、Pycharm 等,也可选择希望的 IDE 或编辑器。

Java的集成开发环境IDEA支持:

点击查找框右侧的 .* 按钮,启用正则表达式支持。

76

其中包含的数据库功能模块也支持正规式查询

(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
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.regex.*;

public class RegexExample {
public static void main(String[] args) {
String text = "The value is 123.45e-6.";
Pattern pattern = Pattern.compile("[+-]?[0-9]+(\\.[0-9]*)?([eE][+-]?[0-9]+)?");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println("Found: " + matcher.group());
}
}
}

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
2
3
String replaced = text.replaceAll("[+-]?[0-9]+(\\.[0-9]*)?([eE][+-]?[0-9]+)?", "[FLOAT]");
System.out.println(replaced);

3.IDEA开发环境

替换:输入 [FLOAT] 并点击 “全部替换”

有效性验证

1.grep sed

由于 grepsed 主要用于文本处理,而非输入验证,因此它们不能直接进行严格的正则匹配验证。但是可以结合 grep -q 命令检查输入是否合法:

1
echo "123.45e-6" | grep -qE '^[+-]?[0-9]+(\.[0-9]*)?([eE][+-]

2.java

1
2
3
boolean isValid = Pattern.matches("^[+-]?[0-9]+(\\.[0-9]*)?([eE][+-]?[0-9]+)?$", "123.45e-6");
System.out.println(isValid); // true

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的字符

Comments