如何使用正则表达式从 JavaScript 中的字符串中删除所有标点符号?

IT技术 javascript regex
2021-01-28 16:17:24

如果我有一个包含任何类型的非字母数字字符的字符串:

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

我如何在 JavaScript 中获得它的无标点版本:

"This is an example of a string with punctuation"
6个回答

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

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 控制台中运行代码的结果:

替代文字

正则表达式中的花括号将一个量词应用到前面,因此在这种情况下,它用\s单个空格替换 2 到 100 个空白字符 ( )。如果你要崩溃了任意数量的空白字符到一个,你会离开过上限,像这样:replace(/\s{2,}/g, ' ')
2021-03-12 16:17:24
我在标点符号列表中添加了更多字符 ( @+?><[]+): replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()@\+\?><\[\]\+]/g, '')如果有人正在寻找一个稍微更完整的集合。
2021-03-25 16:17:24
2020 年更新:所有浏览器现在都支持 regexp 中的 unicode 字符类......var punctuationless = s.replace(/[^\p{L}\s]/gu,"");今天无处不在。
2021-03-25 16:17:24
我试过“它?” - 对我不起作用(regex101.com/r/F4j5Qc/1),正确的解决方案是:/[.,\/#!$%\^&*;:{}=\-_`~() \?]/G
2021-03-30 16:17:24
Python 的 string.punctuation 将标点定义为:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~哪个更适合我,所以另一种选择是:replace(/['!"#$%&\\'()\*+,\-\.\/:;<=>?@\[\\\]\^_`{|}~']/g,"");
2021-04-03 16:17:24
str = str.replace(/[^\w\s]|_/g, "")
         .replace(/\s+/g, " ");

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

详细解释:

  1. \w 是任何数字、字母或下划线。
  2. \s 是任何空格。
  3. [^\w\s] 是不是数字、字母、空格或下划线的任何东西。
  4. [^\w\s]|_ 除了重新添加下划线外,与 #3 相同。
这会弄乱诸如wouldn't和之类的don't
2021-03-17 16:17:24
@njboot 它将多个相邻的空格折叠为单个空格。
2021-03-26 16:17:24
这也将去除非英语但完美的字母数字字符,如 à、é、ö,以及整个西里尔字母。
2021-03-31 16:17:24
@quemeful 我不同意,原始问题没有指定“仅适用于英语”。SO 相当国际化,在世界各地使用。任何会说英语并可以访问互联网的人都可以使用它。如果问题中没有指定语言,那么我们不应该做出任何假设。我们在 2017 年,该死!
2021-04-07 16:17:24
此外,即使您只支持英语,您也可以借用诸如简历和地名或人名之类的词,因此您不会想破坏某人说他们在圣何塞工作(官方拼写)在 Ramón Chloé 之间的隔间里的能力。
2021-04-08 16:17:24

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

对于 Unicode 标点符号(例如弯引号、长破折号等),您可以轻松匹配特定的块范围。一般标点符号\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

对于 Unicode 标点符号,块是不够的。您必须查看一般类别的标点符号,您会发现并非所有标点符号都很好地位于这些块中。例如,拉丁语块中有许多熟悉的标点符号。
2021-03-20 16:17:24

/[^A-Za-z0-9\s]/g 应该匹配所有标点符号但保留空格。因此,.replace(/\s{2,}/g, " ")如果需要,您可以使用来替换额外的空格。您可以在http://rubular.com/ 中测试正则表达式

.replace(/[^A-Za-z0-9\s]/g,"").replace(/\s{2,}/g, " ")

更新:仅当输入为 ANSI 英语时才有效。

您假设该字符串是 ANSI 英语。不是带有重音字母的法语 (àéô),也不是德语、土耳其语。Unicode 阿拉伯文、中文等也将消失。
2021-03-12 16:17:24
谢谢,完全没有考虑。
2021-03-26 16:17:24

我遇到了同样的问题,这个解决方案成功了,并且非常易读:

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、bc

\W是任何非单词,因此[^\W]+将否定任何不是单词char 的内容

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

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

/[^_\W]+/g

漂亮干净;)

@NicolasBernier 是的,100% 正确 - JavaScript 的正则表达式引擎实际上非常蹩脚(参见:stackoverflow.com/questions/4043307/...) - 不幸的是,对于更复杂的任务(以及为非英语单词创建模式),它需要一些更多代码。尽管如此,对于一个快速简洁的正则表达式来去除标点符号,它仍然有效:)
2021-03-13 16:17:24
此方法仅适用于英语,所有带重音的字符都将被删除。
2021-03-17 16:17:24
这是最简单的,并且很好地达到了我的目的。
2021-03-22 16:17:24
您还可以使用此方法将所有新行更改为空格。
2021-04-06 16:17:24