第六章 打造高效正则表达式

多选结构的代价很高

Page.231

多选结构或许是回溯的主要原因,字符组一般只是进行简单的测试,所以效率要比对应的多选结构高。

\cx 匹配control + 控制字符,就是说 匹配由x指明的控制字符

这里的X是一个控制字符。匹配一个字符串的控制字符。

比如:
\cI 匹配 control + I,等价于 \t,
\cJ匹配 control + J,等价于 \n,
\cM匹配 control + M,等价于 \r\ca \cb \cc … 又分别匹配 control+a, control+b,control+c….,具体他们等价于什么,看运行的程序了

Java 中的正则表达式

  • 单词分界符 \b \B 能够识别 Unicode 字符

  • 顺序环视中支持任意长度的表达式,逆序环视则不允许(可以出现?, 不能出现 *, +

  • \Q…\E 消除之间所有元字符的特殊含义,当作普通字符来看(不包括\E, 所以如果原始字符串中包含\E, 就不能直接在首位加\Q和\E来直接使用,具体参见 Pattern.quote 方法)

1
2
// 也可以使用此方法,返回 \Q.\E
Pattern.quote(".")
  • anchoring bounds 标志位,如果检索范围不等于整个目标字符串,设定是否将检索范围的边界设置为 “文本起始位置” 和 “文本结束位置”, 影响文本行边界元字符 (\z \Z \A ^ $),Reset 方法不修改此标志位

  • transparent bounds 标志位, 如果检索范围是整个目标字符串的一段文本,设置为true,允许 look 结构(环视,单词分界符)超越检索范围的边界,检查外部的文本,默认为 false, Reset 方法不修改此标志位

  • find 方法,replaceAll, replaceFirst 方法,在内部都会调用 Reset, 即检索范围重置为整个文本, 将匹配的位置指向文本的开头,弃用前一次成功匹配的所有信息

  • 匹配结果中的偏移值 (start end) 与 检索范围没有关系, 是在整个文本中的位置

一个值设置为transient,然后初始化,加锁

如: Files.lines(new File(strPath).toPath, StandardCharsets.UTF_8)