即使存在匹配项,String.match()函数也将返回null

时间:2019-02-09 15:37:20

标签: javascript node.js regex

我正在尝试将正则表达式与文件中的某些数据进行匹配,但是即使数据中明显存在匹配项,match函数也将返回null。

我在RegExr上尝试了相同的数据和正则表达式,结果显示匹配。

以下是代码

var fs = require('fs');
try {  
    var data = fs.readFileSync('File.txt', 'utf8');
    data = data.toString();
    var regex = /^(hi|hI|Hi|HI)\s[^dD].*?$/gm;
    var result = data.match(regex);
} catch(e) {
    console.log('Error:', e.stack);
}

这些是文件的内容

Hi Alex how are you doing
hI dave how are you doing
Good by Alex
hidden agenda
Alex greeted Martha by saying Hi Martha

我在RegExr上使用了相同的数据,它显示了第一行为匹配项。但是当我在计算机上运行上述代码时,结果变量仍为null。

有什么我想念的吗?

下面是我在vscode中调试代码时的一些屏幕截图。

  1. 数据变量的内容 enter image description here

  2. 结果变量的
  3. 状态。 enter image description here

  4. JSON.stringify的
  5. 结果 enter image description here

编辑。 JSON.stringify结果

我在cmd上运行了程序,令人震惊的是,字符串前面有一个空格。

3 个答案:

答案 0 :(得分:2)

JSON输出中的空格似乎为BOM。如果是这样,data.codePointAt(0)应该是65279

答案 1 :(得分:2)

使用fs.readFileSync读入文件时,物料清单不会从读取的数据中剥离,而是由程序员来处理。参见fs.readFileSync(filename, 'utf8') doesn't strip BOM markers

您可以只使用

data = data.replace(/^\uFEFF/, '')

这将删除BOM表(如果有的话),然后您可以运行正则表达式。

请注意,在文本编辑器(如VIM,记事本)中打开文本文件时,您看不到BOM,因为它们可以处理BOM。

答案 2 :(得分:2)

已经通过上述@vsemozhetbyt的答案和许多有用的注释解决了该问题。

如果将来有人遇到一些问题,我会添加此答案以帮助您。

为什么发生?

由于编码错误,在我的特殊情况下,File.txt最初是File.jsp,我将其扩展名更改为.txt并保存了它。 之后,我读取了file.txt,其中包含与JSP相同的文本,并且进行了相同的正则表达式匹配,因此效果很好,并且文件中没有BOM。

当我在记事本中打开文件并将其所有内容替换为问题中显示的5行文本并保存后,出现了问题。

什么是BOM

阅读精彩的article

我如何删除BOM

我使用vip在二进制模式下打开文件

vim -b File.txt

然后我删除了前三个字符(字节)