正则表达式,用于将字符串中的字符更改为下划线,但First char除外

时间:2015-05-17 15:05:56

标签: javascript regex

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

  

示例:这是一个测试。 => T___ i_ a T ___。

我提出:(\ w)\ w * / g 会导致 T i a T 。但我不知道如何获得下划线。

感谢。

4 个答案:

答案 0 :(得分:3)

这应该有效:

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

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

答案 1 :(得分:2)

你尝试的天真正确的版本将是

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包含扩展拉丁字母表中的每个字符(基本形式,重音形式,大写和小写形式)。

答案 2 :(得分:1)

你可以这样做,

> 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)正则表达式捕获第一个单词字符以及前一个空格或行边界的起点。

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

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

  • 现在整场比赛被替换为,

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

答案 3 :(得分:0)

你的正则表达,就像你说的那样。要用_替换字母,请将替换变量与函数参数一起使用:

 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, '_'); 
                 });