我需要对字符串执行以下操作:
删除所有标点符号(但保留空格)(可以包括删除外国字符)
添加破折号而不是空格
到小写
我希望能够尽可能简洁地执行此操作,例如在一行上。
目前,我有:
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
最佳答案
您可以使用以下正则表达式仅匹配ASCII标点和一些符号(source)-也许我们应该从其中删除_
:
var punct = /[!"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~-]+/g;
或收缩率更高的符号,因为其中一些符号在ASCII table中显示为连续字符:
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());
或在带有箭头功能的替换中使用匿名方法(兼容性较差,但简洁):
var s="Travel dates?:"; // = travel-dates
var o=/([!-\/:-@\[-^`{-~]+)|\s+/g;
console.log(s.replace(o,(m,g)=>g?'':'-').toLowerCase());
请注意,您也可以使用
XRegExp
将任何Unicode标点与\pP
构造匹配。关于javascript - 删除标点符号,保留空格,到小写字母,简洁地添加破折号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39290420/