var text = 'Как удалить все пробелы в тексте кроме первого встречающегося?';
var count = 0;
text = text.replace(/ /g,
function() {
if (++count > 1) {
return '';
} else {
return ' ';
}
});
console.log(text);
var s = "1 2 3 4 5 6 ";
var first = false;
var res = s.replace(/\s+/g, function($0) {
if (!first) {
first = true;
return $0;
} else return "";
})
console.log(res);
var s = "1 2 3 4 5 6 ";
// Если нужно оставить целую первую пробельную последовательность
var res = s.replace(/(^\S*)?\s+/g, function($0,$1) {
return $1 ? $0 : "";
});
console.log(res);
// Если нужно оставить только 1-й пробел из первой пробельной последовательности
res = s.replace(/(^\S*)?(?!^)\s/g, function($0,$1) {
return $1 ? $0 : "";
});
console.log(res);
var text = "Как удалить все пробелы в тексте кроме первого встречающегося?"
console.log(text.split("").reverse().join("").replace(/ (?=.*? )/g,"").split("").reverse().join(""))
function delSpaces (s) {
let arr = s.split(' ');
let s1 = arr.splice(1).join('');
return `${arr[0]} ${s1}`;
};
console.log(delSpaces('Убрать пробелы везде кроме первого'));
甚至在一行中,这可能会影响可读性:
function delSpaces (s) {
return `${s.split(' ')[0]} ${s.split(' ').splice(1).join('')}`;
};
console.log(delSpaces('Убрать пробелы везде кроме первого'));
不使用函数的纯正则表达式的变体
在这里,第一个捕获组
(^[^ ]* )(它将捕获从行首到第一个空格的文本+空格本身)将只工作一次,并将原封不动地插入到结果字符串$1中,然后[ ]+将遇到的所有空格都删除,因为第一个捕获组将返回一个空值。将柜台挂在空格上;)
现代方法
您可以在后预览块中使用未知长度模式:
查看表达式如何工作的示例。
(?<=\s.*?)– 向后查找块,查找字符串中紧接空格字符后跟 0 个或多个任意字符(尽可能少)的位置,并\s+找到 1 个或多个空白字符。旧答案
由于正则表达式引擎本身并不知道它找到了多少个匹配项,因此您需要自己添加标志并将其设置为
true是否已找到第一个匹配项。以下是删除除第一个空格之外的空格序列的示例:
如果只想保留第一个序列的第一个空格,请将表达式更改为
请注意,它会
\s找到任何空白字符,如果您只想删除常规空白(字符\x20),请替换为/ /(请参阅@Visman 的回答)。'`。有一种方法可以在没有计数器和标志的情况下进行。使用
(^\S*\s*)?\s+,您可以检查第一个子模式的模式是否已被捕获,如果是,则保留它,否则将其删除:第一季常规赛详情
(^\S*)?- 捕获第 1 组、1 或 0 个匹配项(可选),找到文本的开头和除空格以外的 0 个或多个字符\s+- 1 个或多个空格。在第二个正则表达式 -
(^\S*)?(?!^)\s- 中有相同的第一个捕获组,之后检查行的开头 ((?!^)) (如果我们在行的开头,则跳过下一个空格),\s它将只找到一个空格字符。没有常客的变体。
您可以通过按空格拆分字符串来使用该方法。
split接下来,在第一个元素后插入一个空格并使用join连接数组
我想稍微调整一下:
可选 (ES6):使用Split、Join、Splice方法
甚至在一行中,这可能会影响可读性: