commit <first commit>
~ 5acc8a29
背景
先放一段尤大一段正則在這里。不知各位看官能否看的明白。
var KEY_RE = /^[^\|<]+/,
ARG_RE = /([^:]+):(.+)$/,
FILTERS_RE = /\|[^\|<]+/g,
FILTER_TOKEN_RE = /[^\s']+|'[^']+'/g,
DEPS_RE = /<[^<\|]+/g,
NESTING_RE = /^\^+/
原因
在看指令那一塊的代碼是尤大寫的幾個正則總是看不懂。在網上查了一圈也沒找到原因。 就是[^\|<]
這種正則。但是當時借助其他方式也完成的代碼邏輯,就沒有去管。
直到有一天終于受不了了。每次看到這一段總感覺如鯁在喉。于是乎又去查了一番。終于找到了答案。
答案
以var KEY_RE = /^[^\|<]+/
為例,最疑惑的地方就是[^\|<]
這種寫法。
^
字符
-
^
這個字符大家都很熟悉了。幾乎所有的解釋都像下面這種。匹配輸入的開始。如果多行標志被設置為true,那么也匹配換行符后緊跟的位置。 例如,/^A/ 并不會匹配 "an A" 中的 'A',但是會匹配 "An E" 中的 'A'。 當 '^' 作為第一個字符出現在一個字符集合模式時,它將會有不同的含義。補充字符集合 一節有詳細介紹和示例。
-
但是在
[]
內的時候^
就有了另一個解釋。叫脫字符(^)如果方括號內的第一個字符是[^],則表示除了字符類之中的字符,其他字符都可以匹配。比如,[^xyz]表示除了x、y、z之外都可以匹配。
所以此處的
^
的含義出匹配除了\|<
這個以外的字符
\|<
字符
-
\|<
寫在這里也是沒有理解。其實很簡單。 就是\|
filter符號和<
依賴符號
綜上
^
匹配輸入的開始[^\|<]
匹配非|
^
這兩個字符+
匹配之前一個或多個滿足匹配的字符/^[^\|<]+/
就是 在輸入字符的開始,匹配不包含|
^
字符的所有字符
如:
var ARG_RE = /^[^\|<]+/
'hello | kaka < haha'.match(ARG_RE)
// result = ["hello ", index: 0, input: "hello | kaka < haha"]
'he_llo:kaka < haha'.match(ARG_RE)
// result = ["he_llo:kaka ", index: 0, input: "he_llo:kaka < haha"]