【问题标题】:Replacement by matching in Javascript通过 Javascript 中的匹配替换
【发布时间】:2019-06-08 18:01:25
【问题描述】:

我需要匹配数字后跟一个单位,并使用 Javascript 将它们替换为数字+下划线+单位。

我提出了这段代码,它没有产生我想要达到的结果。

var x = myFunction("I have 3 billion dollars");

function myFunction(text) {
return  text.replace(/(\d+\.?(?:\d{1,2})?) (\bmillion\b|\bbillion\b|\bbillion\b|\bmillions\b|\bbillions\b|\btrillion\b|\btrillions\b|\bmeter\b|\bmeters\b|\bmile\b|\bmiles\b|\%)/gi, function (match) {
          return "<span class='highlighted'>" + match[1] + "_" + match[2] + "</span>";
    });
 }

上面的代码应该返回“我有 30 亿美元”(但就替换而言,它返回 _b)。由于我是 Java 新手,任何建议都将不胜感激。

编辑 已经有很多有用的提示了!这里还有一些输入示例:

the street is 4.5 miles long
the budget was 430.000 dollars

【问题讨论】:

  • 输入字符串有多少变化?你能提供更多样本还是总是类似于 string number space 单位 字符串?
  • match in function (match) 是整个匹配的字符串。您可以使用function (match, group1, group2) 并使用group1group2 而不是match[1]match[2],但您确实不需要匿名方法,使用text.replace(your_regex, "&lt;span class='highlighted'&gt;$1_$2&lt;/span&gt;")
  • 嗨兰迪,输入基本上是运行文本,可能包含数字(任何格式)和一组测量单位。在这种情况下,我对 Javascrit 的错误更感兴趣,而对正则表达式(我可能需要调整)的兴趣不大。正如答案中所指出的,错误在于“匹配”不是数组而是字符串。

标签: javascript regex replace regex-lookarounds regex-group


【解决方案1】:

为您提供更简单更清晰的示例

let regex = /\d+ (million|billion|millions|billions|trillion|trillions|meter|meters|mile|miles)/g

let match = "I have 3 billion dollars".match(regex)
let replace = match.map(x => x.split(" ").join("_"))

console.log(replace)

【讨论】:

    【解决方案2】:

    如果可行,我们可以将str.replace 与您的原始表达式一起使用:

    const regex = /(\d+\.?(?:\d{1,2})?) (\bmillion\b|\bbillion\b|\bbillion\b|\bmillions\b|\bbillions\b|\btrillion\b|\btrillions\b|\bmeter\b|\bmeters\b|\bmile\b|\bmiles\b|\%)/gm;
    const str = `3 billion
    3 million`;
    const subst = `<span class='highlighted'>" $1_$2 "</span>`;
    
    // The substituted value will be contained in the result variable
    const result = str.replace(regex, subst);
    
    console.log('Substitution result: ', result);

    另外,我们可以稍微简化一下表达式:

    (\d+\.?(?:\d{1,2})?) (\bmillions?\b|\bbillions?\b|\btrillions?\b|\bmeters?\b|\bmiles?\b|\%)
    

    const regex = /(\d+\.?(?:\d{1,2})?) (\bmillions?\b|\bbillions?\b|\btrillions?\b|\bmeters?\b|\bmiles?\b|\%)/gm;
    const str = `3 billion
    3 million
    3 %
    2 meters`;
    const subst = `<span class='highlighted'>" $1_$2 "</span>`;
    
    // The substituted value will be contained in the result variable
    const result = str.replace(regex, subst);
    
    console.log(result);

    Demo

    正则表达式

    如果不需要此表达式并且您希望对其进行修改,请访问此链接regex101.com

    正则表达式电路

    jex.im 可视化正则表达式:

    【讨论】:

    • 所有答案都很好,但我选择了这个,因为它非常完整且内容丰富。
    【解决方案3】:

    match 不是数组,而是字符串。你可以split' '加入_

    var x = myFunction("I have 3 billion dollars");
    
    function myFunction(text) {
    return  text.replace(/(\d+\.?(?:\d{1,2})?) (\bmillion\b|\bbillion\b|\bbillion\b|\bmillions\b|\bbillions\b|\btrillion\b|\btrillions\b|\bmeter\b|\bmeters\b|\bmile\b|\bmiles\b|\%)/gi, function (match) {
              console.log(match)
              return "<span class='highlighted'>" +match.split(' ').join('_')+ "</span>";
        });
     }
    console.log(x)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 2010-10-29
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多