删除标点符号,保留空格,toLowerCase,简洁地添加短划线

时间:2016-09-02 10:41:27

标签: javascript regex

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

  • 删除任何标点符号(但保留空格)(可包括删除外来字符)
  • 添加破折号而不是空格
  • toLowercase

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

目前我有:

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

我遇到的问题很少。首先,上面的行在语法上是不正确的。我认为这是/[^\w\s]的问题,但我不确定我做错了什么。

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

我要改变的例子:

Where to? = where-to

Destination(s) = destinations

Travel dates?: = travel-dates

编辑:我已从第一个正则表达式替换中更新了缺少的/。我发现Destination(s)正变为destinations),这是特殊的。

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

2 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式仅匹配ASCII标点符号和一些符号(source) - 也许我们应该从中删除_

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

或更合同的一个,因为其中一些符号在ASCII table中显示为连续的字符:

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

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

&#13;
&#13;
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());
&#13;
&#13;
&#13;

或者在替换中使用箭头函数中的匿名方法(兼容性较差,但是succint):

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

请注意,您还可以使用XRegExp将任何Unicode标点符号与\pP构造进行匹配。

答案 1 :(得分:1)

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>

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