删除标点符号,保留空格,小写,简洁地添加破折号

Remove punctuation, retain spaces, toLowerCase, add dashes succinctly

本文关键字:添加 简洁 破折号 空格 标点符号 保留 删除 小写      更新时间:2023-09-26

我需要对字符串执行以下操作:

  • 删除任何标点符号(但保留空格)(可以包括删除外国字符)
  • 用破折号代替空格
  • toLowercase

我希望能够尽可能简洁地做到这一点,例如在一行上。

现在我有:

const ele = str.replace(/[^'w's]/, '').replace(/'s+/g, '-').toLowerCase();

我有几个问题。首先,上面这一行语法不正确。我认为这是/[^'w's]的问题,但我不确定我做错了什么。

其次,我想知道是否有可能编写一个删除标点符号并将空格转换为破折号的regex语句?

我想改变的例子:

Where to? = where-to

Destination(s) = destinations

Travel dates?: = travel-dates

编辑:我已经从第一个正则表达式替换中更新了缺失的/。我发现Destination(s)正在变成destinations),这很奇怪。

Codepen: http://codepen.io/anon/pen/mAdXJm?editors=0011

您可以使用以下regex只匹配ASCII标点符号和一些符号(源)-也许我们应该从中删除_:

var punct = /[!"#$%&'()*+,.'/:;<=>?@'[''']^`{|}~-]+/g;

或更简洁的

,因为其中一些符号在ASCII表中作为连续字符出现:

var punct = /[!-'/:-@'[-^`{-~]+/g;

你可以链接2个正则表达式替换。

var punct = /[!"#$%&'()*+,.'/:;<=>?@'[''']^`{|}~-]+/g;
var s = "Where to?"; // = where-to
console.log(s.replace(punct, '').replace(/'s+/, '-').toLowerCase());
s = "Destination(s)"; // = destinations
console.log(s.replace(punct, '').replace(/'s+/, '-').toLowerCase());
console.log(s.replace(punct, '').replace(/'s+/, '-').toLowerCase());

或者在replace中使用一个带有箭头函数的匿名方法(兼容性较差,但简洁):

var s="Travel dates?:"; // = travel-dates
var o=/([!-'/:-@'[-^`{-~]+)|'s+/g;
console.log(s.replace(o,(m,g)=>g?'':'-').toLowerCase());

注意,您也可以使用XRegExp来匹配任何Unicode标点符号与'pP结构。

Wiktor谈到了这个主题,但我首先想到的是使用正则表达式/('s+)|(['W])/g的匿名函数,如下所示:

var inputs = ['Where to?', 'Destination(s)', 'Travel dates?:'],
    res,
    idx;
for( idx=0; idx<inputs.length; idx++ ) {
  res = inputs[idx].replace(/('s+)|(['W])/g, function(a, b) {return b ? '-' : '';}).toLowerCase();
  document.getElementById('output').innerHTML += '"' + inputs[idx] + '" -> "'
        + res + '"<br/>';
}
<!DOCTYPE html>
<html>
<body>
<p id='output'></p>
</body>
</html>

regex捕获空格(1+)非单词字符。如果第一个为真,则匿名函数返回-,否则返回空字符串。