我试图找到正则表达式,修改包含下划线的字符串中的单个单词,但第一个字符除外。
示例:这是一个测试。 => T___ i_ a T ___。
我提出:(\ w)\ w * / g 会导致 T i a T 。但我不知道如何获得下划线。
感谢。
答案 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, '_');
});