Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将字符串中的单词字符更改为下划线(第一个字符除外)的正则表达式_Javascript_Regex - Fatal编程技术网

Javascript 将字符串中的单词字符更改为下划线(第一个字符除外)的正则表达式

Javascript 将字符串中的单词字符更改为下划线(第一个字符除外)的正则表达式,javascript,regex,Javascript,Regex,我试图找到一个正则表达式,它修改除第一个字符外包含下划线的字符串中的单个单词 示例:这是一个测试。=>T_____________ 我想出了:(\w)\w*/g,结果是tiat。但我不知道怎么把下划线放好 谢谢。这应该可以: "This is a Test".replace(/\B\w/g, "_") 说明:替换每个单词字符,除非前面有一个非单词字符。您的正则表达式,如您所说,它会对单词进行替换。要将字母替换为u,请使用带有函数参数的替换变量: var sentence = "Now is

我试图找到一个正则表达式,它修改除第一个字符外包含下划线的字符串中的单个单词

示例:这是一个测试。=>T_____________

我想出了:(\w)\w*/g,结果是tiat。但我不知道怎么把下划线放好

谢谢。

这应该可以:

 "This is a Test".replace(/\B\w/g, "_")

说明:替换每个单词字符,除非前面有一个非单词字符。

您的正则表达式,如您所说,它会对单词进行替换。要将字母替换为u,请使用带有函数参数的替换变量:

 var sentence = "Now is the time for all good men";
 var cached = sentence.replace (/(\w)(\w*)/g, 
                 function (_,initial,  rest) { 
                   return initial + rest.replace (/./g, '_'); 
                 });

你可以这样做

> var s = 'This is a Test.'
> s.replace(/((?:^|\s)\w)(\w*)/g, function(x,y,z) {return y+z.replace(/./g, '_')});
'T___ i_ a T___.'
  • ((?:^ |\s)\w)
    regex捕获第一个单词字符以及前面的空格或行边界的开头

  • (\w*)
    捕获以下零个或多个单词字符

  • 因此,整个匹配由第一个功能参数
    x
    引用,然后第一个捕获组内的字符由
    y
    引用,第二个捕获组内的字符由
    z
    引用

  • 现在整个比赛被

    • y
      ->第一个捕获组中的字符
    • 加上
    • z.replace(//g,'.'.''.''.'code')
      将第二个捕获组中存在的每个字符替换为
      .
      符号。然后将最终结果与
      y
      连接起来,形成最终替换字符串

您尝试的天真正确版本是

var wordMatch = /\b(\w)(\w+)/g;

input.replace(wordMatch, function ($0, $1, $2) {
    return $1 + (new Array($2.length)).join('_');
});
但是,这不适用于带有重音字符的单词,因为
\w
仅包括ASCII范围(a-z)和下划线,严格来说,下划线不是单词字符

更正确的版本将使用一组Unicode范围代替
\w

var latinRanges = "\\u0041-\\u005a\\u0061-\\u007a\\u0100-\\u01bf\\u01c4-\\u024f";
    wordMatch = new RegExp("(?:^|[^" + latinRanges + "])([" + latinRanges + "])([" + latinRanges + "]+)", "g");

input.replace(wordMatch, function ($0, $1, $2) {
    return $1 + (new Array($2.length)).join('_');
});

范围
\u0041-\u005a
\u0061-\u007a
\u0100-\u01bf
\u01c4-\u024f
包括扩展拉丁字母表中的每个字符(基本形式、重音形式、大写和小写形式)。

啊,我试图做同样的事情,但我使用的是\b而不是\b。整洁的解决方案!它很有魅力,而且很小。谢谢效果很好。但更简单的是格奥尔格的解决方案