Javascript 函数返回空值,即使存在匹配项

Javascript 函数返回空值,即使存在匹配项,javascript,node.js,regex,Javascript,Node.js,Regex,我试图将正则表达式与文件中的某些数据进行匹配,但是,即使数据中明确存在匹配项,match函数也会返回null 我尝试了相同的数据和正则表达式,它显示了一个匹配 下面是代码 var fs = require('fs'); try { var data = fs.readFileSync('File.txt', 'utf8'); data = data.toString(); var regex = /^(hi|hI|Hi|HI)\s[^dD].*?$/gm; v

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

我尝试了相同的数据和正则表达式,它显示了一个匹配

下面是代码

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上使用了相同的数据,它将第一行显示为匹配。但是当我在我的机器上运行上述代码时,结果变量仍然为空

有什么我遗漏的吗

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

  • 数据变量的内容

  • 结果变量的状态。

  • JSON.stringify的结果

  • 编辑。JSON.stringify结果


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

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

    当您使用
    fs.readFileSync
    读取文件时,BOM表不会从读取的数据中剥离,而是由程序员来处理。看

    你可以用

    data = data.replace(/^\uFEFF/, '')
    
    这将删除BOM表(如果存在),然后您可以运行正则表达式


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

    通过以上@vsemozhetbyt的回答和许多有用的评论,问题已经解决了

    我添加这个答案是为了帮助将来遇到问题的人

    为什么会这样?

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

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

    什么是BOM

    读这本好书

    我是如何删除BOM的

    我在vim中以二进制模式使用

    vim -b File.txt
    

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

    FYI,您的正则表达式也可以写成
    /^hi\s[^d].*/gmi
    您的代码对我来说很好。您如何知道
    结果
    ?您发布的代码中没有任何内容检查
    result
    的值。您的实际代码中是否有
    console.log()
    ?@nologin,这绝对没有什么区别;正则表达式文本没有什么问题。可能您加载了错误的文件!你能做一下console.log(JSON.stringify(data))并告诉我们你得到了什么吗?(请不要截图)