【问题标题】:Remove punctuation, retain spaces, toLowerCase, add dashes succinctly删除标点符号,保留空格,toLowerCase,简洁地添加破折号
【发布时间】:2016-09-02 10:41:27
【问题描述】:

我需要对一个字符串做如下操作:

  • 删除所有标点符号(但保留空格)(包括删除外来字符)
  • 添加破折号而不是空格
  • 转小写

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

目前我有:

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

【问题讨论】:

  • 您忘记了结束正则表达式分隔符 /(在 /[^\w\s], 中)。你只关心 ASCII 标点符号吗?全部来自这里 - kerryr.net/pioneers/ascii3.htm?试试.replace(/[!"#$%&'()*+,.\/:;<=>?@\[\\\]^_`{¦}~-]/g, '').replace(/\s+/, '-')
  • /[^\w\s]/g 你也忘记了第一次替换时的全局修饰符。
  • 正则表达式匹配。我不认为你可以在一个语句中匹配和替换不同的东西......
  • 关于您的编辑 - 请参阅 Evolutionxbox 的评论。您没有得到 ) 的替换,因为您缺少 g 标志

标签: javascript regex


【解决方案1】:

您可以使用以下正则表达式仅匹配 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 来匹配任何带有 \pP 构造的 Unicode 标点符号。

【讨论】:

  • 好吧,我想我调整了答案。或者你想要一个带有单个正则表达式的版本?请注意,要使用\p{P}\p{S},您需要使用XRegExp
【解决方案2】:

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+) 非单词字符。如果第一个为真,则匿名函数返回-,否则返回空字符串。

【讨论】:

  • 我将“succint”理解为“short”——将代码的长度与匿名方法和链式replaces 进行比较。好吧,如果你使用箭头函数,它看起来会更短。
猜你喜欢
  • 1970-01-01
  • 2014-06-20
  • 2011-04-08
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多