javascript - 将带括号的正则表达式匹配传递给函数

标签 javascript regex-lookarounds

我有一个包含 mm-yyyy 日期的字符串;年年年月; 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));

最佳答案

可能您正在寻找的是这样的东西:

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,您将进入对此进行解释的部分。

Specifying a function as a parameter

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

关于javascript - 将带括号的正则表达式匹配传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53964595/

相关文章:

javascript - 用于匹配用户输入并转换为 Javascript 对象的正则表达式

asp.net - 更改密码控制正则表达式仅在 IE 7 中奇怪地验证

regex - Python正则表达式在匹配后匹配n行

java - java中从一行中删除px的正则表达式

javascript - 如何区分阿拉伯语和字母?

javascript - 调用 ajaxrequest 后,asp 验证控件未触发

php - 使用 "Jquery file upload plugin"直接上传文件到FTP服务器

javascript - 单击下拉列表的特定选项时隐藏表单,单击下拉列表的特定选项时显示表单

c# - 用于匹配日期的正则表达式(月日、年或 m/d/yy)

具有前瞻性的 Java 正则表达式