【问题标题】:String.match() function returns null even when there is a match即使存在匹配,String.match() 函数也会返回 null
【发布时间】:2019-02-09 15:37:19
【问题描述】:

我正在尝试将正则表达式与文件中的某些数据进行匹配,但是即使匹配明显存在于数据中,匹配函数也会返回 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 上使用了相同的数据,它将第一行显示为匹配项。但是当我在我的机器上运行上面的代码时,结果变量仍然为空。

有什么我想念的吗?

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

  1. 数据变量的内容

  2. 结果变量的状态。

  3. JSON.stringify 的结果

编辑。 JSON.stringify 结果

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

【问题讨论】:

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

标签: javascript node.js regex


【解决方案1】:

在@vsemozhetbyt 的回答和许多有用的 cmets 的帮助下,问题已得到解决。如果将来有人遇到某些问题,我将添加此答案以提供帮助。

为什么会这样?

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

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

什么是物料清单

阅读这篇很棒的article

我如何删除 BOM

我使用 vim 以二进制模式打开文件

vim -b File.txt

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      你可以使用

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

      如果 BOM 存在,这将删除它,然后您可以运行您的正则表达式。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-20
        • 1970-01-01
        • 1970-01-01
        • 2020-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多