【问题标题】:JavaScript Regex not replacing as expectedJavaScript 正则表达式未按预期替换
【发布时间】:2016-09-03 06:08:24
【问题描述】:

我在 PHP 中有这个功能:

function sanitizeKey($str){
  $str = strtolower($str);
  $str = preg_replace('/[^\da-z ]/i', '', trim(ucwords($str)));
  $str = str_replace(" ", "", $str);
  $str = lcfirst($str);
  return $str;
}

当针对Manufacture's P/N 运行时,输出为manufacturesPn。

我正在用 Javascript 重写相同的函数,到目前为止有这个代码:

str = "Manufacture's  P/N";

str = str.toLowerCase()
  .replace(/\b[a-z]/g, function(letter) { // php's ucwords
    return letter.toUpperCase();
  });
str = str.trim(); // remove leading & trailing whitespace
str = str.replace("/[^\da-z ]/i", ''); // keep alphanumeric
str = str.replace(/\s+/g, ''); // remove whitespace
str = str.replace(/\b[a-z]/g, function(letter) { // php's lcfirst
  return letter.toLowerCase();
});

console.log(str);

此时如果我输入Manufacture's P/N,则当前输出为Manufacture'SP/N。

问题 如何更改我的 JavaScript 代码以复制 PHP 程序,以便它为相同的输入生成相同的输出?

【问题讨论】:

  • @whoever 如果您投反对票,请解释原因。

标签: javascript php regex


【解决方案1】:

你可以使用:

str = "Manufacture's  P/N";
    
console.log(
str.trim()
.toLowerCase()
.replace(/[^\da-z ]+/gi, '')
.replace(/(?!^)\b[a-z]/g, function(c) {
   return c.toUpperCase(); 
})
.replace(/\s+/g, '')
)
    
//=> "manufacturesPn"

在 Javascript 中,您不应引用正则表达式,例如"/[^\da-z ]/i" 并使用全局标志进行全局替换。

【讨论】:

  • 啊啊!非常感谢,我正在等待解释。
  • (?^) 是否定前瞻,以跳过起始字符变为大写。
【解决方案2】:

您可以在.replace() 函数中匹配使用.test()、.indexOf() 的每个字符

var str = "Manufacture's  P/N";

var res = str.replace(/./g, function(p) {      
  return /[a-z]/i.test(p) && !/\s/.test(str[str.indexOf(p) - 1]) 
         ? p.toLowerCase() : /['/ ]/.test(p) ? "" : p
});

console.log(res);

【讨论】:

    【解决方案3】:

    请试试这个。

    str = "Manufacture's  P/N";
    
    str = $.trim(str).split("  ");
    str1 = str[0].toLowerCase().replace("'", '');
    str2 = str[1].toLowerCase().replace("/", '');
    str3 = str2.charAt(0).toUpperCase() + str2.slice(1);
    finalString = str1 + str3;
    
    return finalString;
    
    console.log(finalString);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-19
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 2012-10-15
      相关资源
      最近更新 更多