$&

  • v0.1.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var regexEscapeRE = /[-.*+?^${}()|[\]\/\\]/g;
/**
* Escape a string so it can be used in a RegExp
* constructor.
*
* @param {String} str
*/

function escapeRegex(str) {
return str.replace(regexEscapeRE, '\\$&');
}

escapeRegex('{{') // \{\{
escapeRegex('}}') // \}\}

String.prototype.replace() - JavaScript | MDN
使用字符串作为参数
替换字符串可以插入下面的特殊变量名:
变量名 代表的值
$$ 插入一个 “$”。
$& 插入匹配的子串。
$` 插入当前匹配的子串左边的内容。
$’ 插入当前匹配的子串右边的内容。
$n
假如第一个参数是 RegExp对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// test
escapeRegex('[')
"\["
escapeRegex('-')
"\-"
escapeRegex('.')
"\."
escapeRegex('*')
"\*"
escapeRegex('+')
"\+"
escapeRegex('?')
"\?"
escapeRegex('^')
"\^"
escapeRegex('$')
"\$"
escapeRegex('{')
"\{"
escapeRegex('}')
"\}"
escapeRegex('(')
"\("
escapeRegex(')')
"\)"
escapeRegex('|')
"\|"
escapeRegex('[')
"\["
escapeRegex(']')
"\]"
escapeRegex('/')
"\/"
escapeRegex('\\')
"\\"

/[-.*+?^${}()|[]\/\]/

  • regexEscapeRE
  • v0.1.1

^[^\|<]+

/\{\{(.+?)\}\}/

  • BINDING_RE
  • v0.1.1
1
2
3
4
5
buildRegex: function () {
var open = escapeRegex(config.interpolateTags.open),
close = escapeRegex(config.interpolateTags.close)
BINDING_RE = new RegExp(open + '(.+?)' + close)
}

正则表达式30分钟入门教程
表1.常用的元字符
. 匹配除换行符以外的任意字符

表5.懒惰限定符
+? 重复1次或更多次,但尽可能少重复

\{\{(.+?)\}\}

/^[^|<]+/

  • variable: KEY_RE
  • version: v0.1.1

  • graph: ^[^\|<]+

  • desc: 字符串不是以’|’或’<’开头

  • test:
    1
    2
    3
    4
    5
    6
    7
    8
    const KEY_RE = /^[^\|<]+/;
    KEY_RE.test('test') // true
    KEY_RE.test('test|') // true
    KEY_RE.test('test<') // true
    const KEY_RE = /^[^\|<]+/;
    KEY_RE.test('|test') // false
    const KEY_RE = /^[^\|<]+/;
    KEY_RE.test('<test') // false

/-oneway$/

  • ONEWAY_RE
  • v0.1.1

-oneway$

/([^:]+):(.+)$/

  • ARG_RE
  • v0.1.1

([^:]+):(.+)$

/^!/

  • variable: INVERSE_RE
  • version: v0.1.1

  • graph: ^!

  • desc: 以’!’开头的字符串

/^\^+/

  • variable: NESTING_RE
  • version: v0.1.1

  • graph: ^\^+

  • desc: 以至少一个’^’开头的字符串,如:’^’, ‘^^’, ‘^^^’, …
  • test:
    1
    2
    3
    4
    5
    var NESTING_RE = /^\^+/g;
    var nesting = key.match(NESTING_RE)

    var key = '^test'
    console.log(nesting) // ["^"]

/|[^|<]+/

  • variable: FILTERS_RE
  • version: v0.1.1

  • graph: \|[^\|<]+

  • desc: ‘|’后不是’|’和’<’的
  • test:
    1
    2
    3
    4
    5
    var FILTERS_RE = /\|[^\|<]+/g;
    var filterExps = expression.match(FILTERS_RE)

    var expression = 'filters | test1 | test2'
    console.log(expression) // ["| 123 ", "| 456"]

/([^:]+):(.+)$/

  • variable: ARG_RE
  • version: v0.1.1

  • graph: ([^:]+):(.+)$

  • desc: group1是至少一个不含’:’的字符串,group2至少一个任意字符串,group1和group2用’:’隔开,并且以group1:group2结尾
  • test:
    1
    2
    3
    4
    5
    var ARG_RE = /([^:]+):(.+)$/g;
    var argMatch = rawKey.match(ARG_RE)

    var rawKey = 'keyup:addTodo'
    console.log(argMatch) // ["keyup:addTodo", "keyup", "addTodo"]