NodeJS RegExp与正则表达式在查找数字上有所不同

时间:2019-02-01 03:00:45

标签: javascript node.js regex

我不知道为什么re/^Text(\d+)?[.]json$/g之间存在差异。

我使用了错误的表达方式吗?

$ node -v
v6.15.0

$ node
> list =[ 'Text.json',
   'Text1.json',
   'Text2.json',
   'Text3.json',
   'Text4.json' ]
> re = new RegExp(/^Text(\d+)?[.]json$/g)

> list.filter(f => re.test(f))
[ 'Text.json', 'Text2.json', 'Text4.json' ]

> list.filter(f => /^Text(\d+)?[.]json$/g.test(f))
[ 'Text.json',
  'Text1.json',
  'Text2.json',
  'Text3.json',
  'Text4.json' ]

> String(/^Text(\d+)?[.]json$/g) === String(re)
true

3 个答案:

答案 0 :(得分:0)

这种奇怪的行为。

只需删除全局标志就可以了。

var list =[ 'Text.json',
   'Text1.json',
   'Text2.json',
   'Text3.json',
   'Text4.json' ]
var re = new RegExp(/^Text(\d+)?[.]json$/)

var filter1 = list.filter(f => re.test(f))
console.log('filter1', filter1)

var filter2 = list.filter(f => /^Text(\d+)?[.]json$/g.test(f))
console.log('filter2', filter2)

var comp = String(/^Text(\d+)?[.]json$/) === String(re)
console.log('comp', comp)

答案 1 :(得分:0)

/g标志使相同的RegExp记住上一次成功匹配的结束位置,并且即使下一次在不同的字符串中也从该位置开始搜索。如果使用RegExp文字,则每次都会重新创建正则表达式,并且此行为没有影响。

请参阅有关MDN的注释和示例in this section

答案 2 :(得分:0)

使用构造函数时,删除反斜杠正则表达式:

re = new RegExp(/^Text(\d+)?[.]json$/g) 变成:

 re = new RegExp('^Text(\d+)?[.]json$', 'g')