如果我有一个字符串,其中有任何类型的非字母数字字符:

"This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation"

我如何在JavaScript中得到一个没有标点符号的版本:

"This is an example of a string with punctuation"

当前回答

截至2021年,许多现代浏览器都支持JavaScript内置的:RegExp: Unicode属性转义。所以你现在可以简单地使用\p{p}:

str.replace(/[\p{P}$+<=>^`|~]/gu, '')

如果您想忽略所有符号(\p{S})和标点符号,则可以进一步简化正则表达式。

str.replace(str.replace(/[\p{P}\p{S}]/gu, '')

如果你想剥离除字母(\p{L}),数字(\p{N})和分隔符(\p{Z})之外的所有内容。你可以使用像这样的否定字符集(也适用于非英语字母数字字符):

str.replace(/[^\p{L}\p{N}\p{Z}]/gu, '')

上面的正则表达式可以工作,但更常见的用例是使用正则表达式的空白类而不是Unicode分隔符字符集,因为后者不包括制表符和换行符。试试这个:

str.replace(/[^\p{L}\p{N}\s]/gu, '')

const str = 'This。, -/ is #!$ % ^ & *示例;:{}= -_字符串,带有' ~)()标点符号'; console.log (str。替换(/ [\ p {p }$+<=>^`|~]/ 顾,”); console.log (str。替换(/ [\ p {p} \ p{年代}]/顾”); console.log (str。替换(/ [^ \ p {L} \ p {N} \ p {Z}] /顾”); console.log (str。替换(/ [^ \ p {L} \ p {N} \ s] /顾”);

你也可能喜欢用.replace(/ +/g, ' ')来串起连续的空格。

你可以随意摆弄这些东西!裁判: Unicode字符属性-维基百科 Unicode属性转义- MDN

其他回答

我遇到过同样的问题,这个解决方案很管用,而且可读性很强:

var sentence = "This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation";
var newSen = sentence.match(/[^_\W]+/g).join(' ');
console.log(newSen);

结果:

"This is an example of a string with punctuation"

诀窍是创建一个负集合。这意味着它匹配任何不在集合内的东西,即[^abc] -不是a, b或c

\W是任何非单词,所以[^\W]+将否定任何非单词char。

通过添加_(下划线),你也可以否定它。

让它全局应用/g,然后你可以通过它运行任何字符串,并清除标点符号:

/[^_\W]+/g

又漂亮又干净;)

str = str.replace(/[^\w\s\']|_/g, "")
         .replace(/\s+/g, " ");

删除除字母数字字符和空白之外的所有内容,然后将多个相邻空白折叠为单个空格。

详细解释:

\w是任意数字、字母或下划线。 \s是任何空白。 [^\w\s\']是指任何不是数字、字母、空格、下划线或单引号的字符。 [^\w\s\']|_与#3相同,只是加了下划线。

根据维基百科的标点符号列表,我必须构建以下正则表达式来检测标点:

[\.’'\[\](){} ⟨⟩:,، 、‒–—―...!.‹›«»‐\-?‘’“”'";/⁄·\&*@\•^†‡°”¡¿※# −№÷׺ª%‰+ =‱¶′″‴§~_|‖¦© ℗®℠™¤₳฿₵¢₡₢₫美元₯֏₠€ƒ₣₲₴₭₺₾ℳ₥₦₧₱₰£៛₽₹₨₪৳₸₮₩¥]

对于en-US(美式英语)字符串,这应该足够了:

"This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation".replace( /[^a-zA-Z ]/g, '').replace( /\s\s+/g, ' ' )

注意,如果你支持UTF-8和像chinese/russian这样的字符,这也会替换它们,所以你真的必须指定你想要什么。

它很简单,只是替换字符而不是单词:

.replace(/[^\w]/g, ' ')