首页 » 精通正则表达式(第3版) » 精通正则表达式(第3版)全文在线阅读

《精通正则表达式(第3版)》Unicode行终结符

关灯直达底部

Unicode Line Terminators

在Unicode之前的传统正则流派中,点号、^、$和/Z会对换行符(ASCII中的LF字符)进行特殊处理。在Java中,大多数Unicode行终结符(☞109)也会这样特殊处理。

正常情况下,Java会把下面的这些字符当作行终结符:

根据匹配模式(☞368)的不同,点号、^、$和/Z会对这些符号进行特殊处理:

作为行终结标志的双字符CR/LF值得一提。默认情况(没有使用 UNIX_LINES时)是识别完整的行终结符,匹配文本行边界的元字符会把CR/LF视为不可分隔的单位,一次性匹配这两个字符。

举例来说,$和/Z 通常会匹配行终结符之前的位置。LF 是行终结符,但只有在它不属于CR/LF(也就是说,LF之前没有CR)的情况下,$和/Z才能匹配字符串末尾的LF之前的位置。

MUTILINE模式中的$和^也是如此,在这种模式下,只有在CR之后没有LF的情况下,^才能匹配CR之后的位置;只有在LF之前不是CR的情况下,$才能匹配LF之前的位置。

必须说清楚的是,DOTALL对CR/LF的处理没有影响(DOTALL只影响点号,而点号总是逐个处理字符的),UNIX_LINES根本不存在此类问题(它只识别CR,所有其他行终结符都不需要特殊处理)。