【问题标题】:Passing a parenthesized regex match to a function将带括号的正则表达式匹配传递给函数
【发布时间】:2018-12-28 21:45:44
【问题描述】:

我有一个包含 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));

【问题讨论】:

    标签: javascript regex-lookarounds


    【解决方案1】:

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

    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

    【讨论】:

    • @sergiotarxz - 非常感谢!是的,您的示例正是我正在寻找的,但是您能否解释一下它是如何工作的 - 匿名函数的参数是保留关键字,我如何找到有关此的任何文档?
    • 我已更改答案以满足您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多