正则表达式,用于将字符串中除“第一个字符”外的其他字符更改为“下划线”

Regular Expression for changing chars of the words in string to underscore except First char

本文关键字:下划线 字符 其他 用于 第一个 第一个字符 正则表达式 字符串      更新时间:2023-09-26

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

Example: This is a Test。=> a

我想出: (' w) ' w */g 导致 T我T 。但是我不知道如何把下划线放到合适的位置。

谢谢。

应该可以:

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

解释:替换每个单词字符,除非它前面有非单词字符

正确的版本应该是

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

你可以这样做,

> 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, '_')将用_符号替换第二个捕获组中的每个字符。然后将最终结果与y连接,形成最终的替换字符串。

您的正则表达式,正如您所说的,与单词相关联。要用_替换字母,请使用函数形参的replace变体:

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