讀古今文學網 > 精通正則表達式(第3版) > Unicode行終結符 >

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,所有其他行終結符都不需要特殊處理)。