我正在尝试将正则表达式与文件中的某些数据进行匹配,但是即使数据中明显存在匹配项,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中调试代码时的一些屏幕截图。
编辑。 JSON.stringify结果
我在cmd上运行了程序,令人震惊的是,字符串前面有一个空格。
答案 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
然后我删除了前三个字符(字节)