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

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

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

"This is an example of a string with punctuation"

当前回答

如果你的目标是一个现代浏览器(不是IE),你可以使用unicode字符类。当您还需要支持诸如德语Umlaute (äöü)或其他字符时,这尤其有用。

这是我最后得到的。它替换所有不是字母、撇号或空格的内容,并用一个空格删除行中的多个空格。

const textStripped = text
  .replace(/[’]/g, "'") // replace ’ with '
  .replace(/[^\p{Letter}\p{Mark}\s']/gu, "") // remove everything that is not a letter, mark, space or '
  .replace(/\s+/g, " ") // remove multiple spaces
.replace(/[’]/g, "'")

First将'(印刷撇号)替换为'(打字机撇号)。因为两者都可以用在像"don 't "这样的词中

.replace(/[^\p{Letter}\p{Mark}\s']/gu, "")

\p{Letter}代表unicode中被归类为字母的任何字符。

\p{Mark}类别需要包括进一步的封面字母标记组合。例如,德语ä可以编码为单个字符,也可以编码为“a”和“Mark”的组合。当从pdf中复制德语文本时,这种情况经常发生。

来源: https://dev.to/tillsanders/let-s-stop-using-a-za-z-4a0m

其他回答

如果您想从字符串中删除特定的标点符号,最好明确地删除您想要的标点符号,例如

replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g,"")

执行上述操作仍然不会返回您指定的字符串。如果您想要删除由于删除疯狂的标点符号而留下的任何额外的空格,那么您将需要执行以下操作

replace(/\s{2,}/g," ");

完整的例子:

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

在firebug控制台中运行代码的结果:

在支持Unicode的语言中,Unicode Punctuation字符属性是\p{p}——为了便于阅读,通常可以缩写为\pP,有时也可以扩展为\p{Punctuation}。

您正在使用Perl兼容正则表达式库吗?

如果您正在使用lodash

_.words('This, is : my - test,line:').join(' ')

这个例子

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

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

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

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

下面是US-ASCII的标准标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

对于Unicode标点符号(如大引号、em-dash等),可以很容易地匹配特定的块范围。一般标点符号块是\u2000-\u206F,补充标点符号块是\u2E00-\u2E7F。

放在一起,并正确转义,您将得到以下RegExp:

/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,\-.\/:;<=>?@\[\]^_`{|}~]/

这应该可以匹配您遇到的任何标点符号。那么,来回答最初的问题:

var punctRE = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,\-.\/:;<=>?@\[\]^_`{|}~]/g;
var spaceRE = /\s+/g;
var str = "This, -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation";
str.replace(punctRE, '').replace(spaceRE, ' ');

>> "This is an example of a string with punctuation"

US-ASCII来源:http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#posix

Unicode来源:http://kourge.net/projects/regexp-unicode-block