javascript - 如果搜索包含括号或方括号,正则表达式匹配返回未定义

标签 javascript regex match

我有一个或多或少像这样使用的脚本:

var $pencilers = {
    '\\(signed\\)': '(assinado)',
    'pencils': 'arte',
    '\\[as ': '[como '
};

var $pencils = 'Al Williamson [as A. W.] (signed)'
var pen = new RegExp(Object.keys($pencilers).join("|"),"g");
$pencils = $pencils.replace(pen, function(matched){
      return $pencilers[matched];
});

console.log($pencils)

// $pencils returns: Al Williamson undefinedA. W.] undefined

无法弄清楚为什么会返回 undefined。

当我在 Regex101 中测试时,它运行良好。有人可以帮忙吗?

最佳答案

如果您执行了 console.log(matched),您会注意到您的匹配项与对象键不匹配。您必须先转义字符串。我借了this neat escape function使其工作:

function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

var $pencilers = {
    '\\(signed\\)': '(assinado)',
    'pencils': 'arte',
    '\\[as ': '[como '
};

var $pencils = $("#id_pencils").val(); // eg. Al Williamson [as A. W.] (signed) //
var pen = new RegExp(Object.keys($pencilers).join("|"),"g");
$pencils = $pencils.replace(pen, function(matched){
      console.log('before escaping: ', matched);
      matched = escapeRegExp(matched);
      console.log('after escaping: ', matched);
      return $pencilers[matched];
});
console.log($pencils);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="id_pencils" value="Al Williamson [as A. W.] (signed)" />

您也可以反过来,让您的对象键不转义,在构建您的正则表达式时转义它们。事实上,我更愿意并推荐使用这种方法,因为它使您的代码更具可读性。

function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

var $pencilers = {
    '(signed)': '(assinado)',
    'pencils': 'arte',
    '[as ': '[como '
};

var $pencils = $("#id_pencils").val(); // eg. Al Williamson [as A. W.] (signed) //
var pen = new RegExp(Object.keys($pencilers).map(escapeRegExp).join("|"),"g");
$pencils = $pencils.replace(pen, function(matched){
      return $pencilers[matched];
});
console.log($pencils);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="id_pencils" value="Al Williamson [as A. W.] (signed)" />

关于javascript - 如果搜索包含括号或方括号,正则表达式匹配返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55958616/

相关文章:

javascript - 调整大小时如何计算图像的宽度和高度值?

javascript - 如何在弹出一个元素时恢复轮盘赌

Python - 从 IP 地址中删除前导零

excel - 类内匹配的错误处理 - Excel VBA

php - Web 表单生成器教程

javascript - NodeJS 不响应 CURL 请求

用于拆分数字和字母的 JavaScript 正则表达式

regex - 删除前导零但不是全零

javascript - 检查 localStorage 项目是否与字符串匹配

python - 如何使用 python diff_match_patch 创建补丁并应用