U+2028行分隔符为何会破坏搜索/选中功能?
几周前遇到一个情况:程序能正常选中所有匹配正则表达式的行,但有一行明明符合规则却无法被选中。反复检查正则表达式无误,重试后情况依旧。逐字符排查才发现,问题根源是一个U+2028: Line separator字符,删除该字符后程序即可正常选中该行。
用于复现问题的字符序列
- U+0061: 小写拉丁字母A;
- U+2028: 行分隔符;
- U+0062: 小写拉丁字母B;
- U+002C: 逗号;
- U+0063: 小写拉丁字母C;
- U+2028: 行分隔符;
- U+0064: 小写拉丁字母D。
问题1:为何该字符序列显示为一行且无行分隔符标识?
根据《Unicode®标准15.0版核心规范》第5.8节表5-1,行分隔符(及段落分隔符)属于换行字符,但开启Tools > Properties for All Configurations > Marks中的Show Newline Characters选项后,行分隔符仍不可见(显示为零宽度字符)。
测试多款编辑器对该序列的显示效果,结果差异明显:
- 部分编辑器显示为三行;
- 部分编辑器显示为一行,行分隔符显示类似空格;
- Chromium浏览器的
textarea元素和Windows记事本显示为一行,行分隔符呈现为带虚线边框的矩形,内部标注L SEP文本; - Firefox浏览器的
textarea元素和EmEditor显示为一行,且无任何标识。
个人认为Chromium/记事本的显示方式更适合作为默认方案。
问题2:为何U+2028行分隔符会破坏搜索/选中功能?
更严重的是搜索与选中功能异常:若需选中所有包含逗号的整行,开启Search > Find...中的Regular Expressions,使用正则表达式^.*?,.*?$或^.*,.*$,并在Advanced...中取消勾选Regular Expression “.” Can Match Newline Characters选项,点击Select All后无任何内容被选中,窗口左下角显示0 matches are found in 0 lines。
若将光标置于文件开头点击Find Next,程序会定位到b,c部分(说明行分隔符被识别为行边界),并用rgb(0, 120, 215)背景选中该部分,但未使用搜索匹配对应的rgb(64, 255, 64)背景高亮;勾选Count Matches选项后,窗口左下角仍显示0 matches are found in 0 lines。
注:U+2029: Paragraph separator(段落分隔符)也存在相同问题,可能还有其他未知字符会意外破坏该功能。
编辑补充
将正则表达式引擎切换为Onigmo后,问题得以解决,程序可正确选中从a到d的整行并高亮。
内容的提问来源于stack exchange,提问作者lyrically wicked

