首页 > 解决方案 > 将带括号的正则表达式匹配传递给函数

问题描述

我有一个包含 mm-yyyy 日期的字符串;yyyy-mm; yyyy-mm-dd 等格式。目标是将日期子字符串的月份部分转换为罗马数字符号,例如

12-2018 ... 2018-12-28

被转换成

XII-2018 ... 2018-XII-28

我使用此函数将常规转换为罗马数字:

// https://stackoverflow.com/questions/9083037/convert-a-number-into-a-roman-numeral-in-javascript
function romanize(num) {
  var lookup = {M:1000,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1},roman = '',i;
  for ( i in lookup ) {
    while ( num >= lookup[i] ) {
      roman += i;
      num -= lookup[i];
    }
  }
  return roman;
}

用于查找月份子字符串的正则表达式是

var re = /(19|20\d{2})\b-(\d{2})/g;

第一个带括号的匹配项 ($1) 仅是 19YY 或 20YY 年。第二个 ($2) 是月份子字符串。问题是我不能将 $2 作为参数传递,即

string = string.replace(re, "$1-" + romanize($2));

标签: javascriptregex-lookarounds

解决方案


可能您正在寻找的是类似的东西:

string.replace(re, function(match, p1, p2) {
    return p1+'-'+romanize(p2);
});

我希望它对你有帮助!

编辑: function() 中参数的含义是位置的,所以第一个参数将是整个匹配,第二个是第一个括号匹配,第三个是第二个括号匹配......

您还可以传递一个已经存在的函数来替换,例如:

function rep(match, p1, p2) {
    p1+'-'+romanize(p2);
}
string.replace(re, rep);

EDIT2:要查找文档,请复制引用的文本并在浏览器的其他选项卡中打开链接,然后在此页面中按 ctrl+f,粘贴下面的文本,然后按一次 ctrl+g,您将进入此部分被解释。

将函数指定为参数

来源:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace


推荐阅读