问答中心分类: REGEX如何使用正则表达式从JavaScript中的字符串中去掉所有标点?
0
Shimon Doodkin 提问 15小时 前

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

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

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

"This is an example of a string with punctuation"
14 Answers
0
Mike Grace 回答 15小时 前

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

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

Mike Partridge 回复 15小时 前

正则表达式中的花括号将量词应用于前面,因此在本例中,它将替换2到100个空格字符(\s)只有一个空格。如果要将任意数量的空白字符压缩为一个,则可以去掉上限,如下所示:replace(/\s{2,}/g, ' ').

timmfin 回复 15小时 前

我在替换的标点符号列表中又添加了几个字符(@+?><[]+):replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()@\+\?><\[\]\+]/g, '')。如果有人想要更完整的一套。

01AutoMonkey 回复 15小时 前

Python的字符串。标点将标点定义为:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~这对我来说更好,所以另一种选择是:replace(/['!"#$%&\\'()\*+,\-\.\/:;<=>?@\[\\\]\^_`{|}~']/g,"");

Alix Axel 回复 15小时 前

我想你失踪了[]从标点符号列表中。

Antoine Lizée 回复 15小时 前

我认为... ,-\/ ...在你的正则表达式中是误导性的。这个-这里的解释类似于范围运算符。您需要:... ,\-\/ ...。在这种情况下,这没有什么区别,因为你试图做到全面,但如果你想删除句号,例如,它将不起作用(因为句号在范围内)

Mike Grace 回复 15小时 前

@我同意这是一种误导。更新了答案。谢谢

Antoine Lizée 回复 15小时 前

@MikeGrace但现在是两次:-)

Mike Grace 回复 15小时 前

@AntoineLizée,这就是我没有仔细阅读所有代码的原因。

trusk 回复 15小时 前

@MikeGrace但当你有“短信”时该怎么办。您的替换将同时删除该单词。

Maxim Firsoff 回复 15小时 前

我试过“它?”-不适合我(regex101.com/r/F4j5Qc/1),正确的解决方案是:/[,\/#!$%\ ^&*;:{}=\-\u`~()\?]/g

Max Pekarsky 回复 15小时 前

我知道这太老了,但谢谢你!必须找出for循环需要反向运行的困难原因:)

MalcolmOcean 回复 15小时 前

我想指出的是,如果你想删除[]然后您需要将它们添加到[],如下所示:/[\[\]?.,\/#!$%\^&\*;:{}=\-_~()]/g`

Tom Lord 回复 15小时 前

这是一个糟糕的答案。问题是“我如何删除?”所有标点符号从字符串?,而不是“如何从字符串中删除特定字符?是的,这个模式有一个有效的用例,但如果没有更好的解释,它不应该是最受欢迎的答案。

Bill Barry 回复 15小时 前

2020年更新:所有浏览器现在都支持regexp中的unicode字符类。。。var punctuationless = s.replace(/[^\p{L}\s]/gu,"");今天到处都能用。

0
John Kugelman 回答 15小时 前
str = str.replace(/[^\w\s\']|_/g, "")
         .replace(/\s+/g, " ");

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

  1. \w是任何数字、字母或下划线。
  2. \s是任何空格。
  3. [^\w\s\']不是数字、字母、空格、下划线或单引号的任何内容。
  4. [^\w\s\']|_与#3相同,只是在后面添加了下划线。
Dan Abramov 回复 15小时 前

这也将剔除非英语但在其他方面非常完美的字母数字字符,如a,é,ö,以及整个西里尔字母表。

Rolf 回复 15小时 前

@很抱歉,我不同意,原来的问题没有具体说明“仅限英语”。因此,它是相当国际化的,在全世界使用。任何说英语并能上网的人都可以使用它。如果问题中没有具体说明语言,那么我们就不应该做出任何假设。我们在2017年,该死!

Chris Adams 回复 15小时 前

此外,即使你只支持英语,你也会有像简历这样的借词和地名或人名,这样你就不会想破坏某人在圣何塞工作(官方拼写)的能力。

null 回复 15小时 前

这会影响以下文字:wouldn'tdon't

njboot 回复 15小时 前

第二个是什么.replace(/\s+/g, " ");在这里完成?

John Kugelman 回复 15小时 前

@njboot它将多个相邻空格折叠为单个空格。

André Levy 回复 15小时 前

同意,@null。已更正。

Brian Patterson 回复 15小时 前

这不适用于它:(.text=“狐狸问鹳,‘汤怎么样?’”,

Brian Patterson 回复 15小时 前

如果要去掉所有标点,请将第一个表达式中的正则表达式替换为。。/[^\w\s]/g

0
Joseph 回答 15小时 前

以下是US-ASCII的标准标点字符:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
对于Unicode标点(如卷曲引号、em短划线等),可以轻松匹配特定的块范围。这个常用标点块是\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

nhahtdh 回复 15小时 前

对于Unicode标点,块是不够的。你必须看看一般的类别标点,你会发现并不是所有的标点都很好地位于这些块中。例如,在拉丁语块中有许多熟悉的标点符号。

mayank 回复 15小时 前

非常有用的答案,可能不适用于某些语言的极端情况,但比早期的更好!谢谢

0
adnan2nd 回答 15小时 前

/[^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英语时有效。

Rolf 回复 15小时 前

假设字符串是ANSI英语。不是带重音字母的法语,也不是德语、土耳其语。Unicode阿拉伯语、汉语等也将消失。

adnan2nd 回复 15小时 前

谢谢,我没有完全想过。

0
jacobedawson 回答 15小时 前

我遇到了同一个问题,这个解决方案做到了这一点,并且可读性很强:

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.
通过添加_u(下划线),您也可以否定这一点。
使其在全球范围内应用/g,然后可以在其中运行任何字符串并清除标点:

/[^_\W]+/g

漂亮干净;)

nhahtdh 回复 15小时 前

也可以使用此方法将所有新行更改为空格。

NicolasBernier 回复 15小时 前

此方法仅适用于英语,删除所有重音字符。

jacobedawson 回复 15小时 前

@NicolasBernier是的,这是百分之百正确的-JavaScript的正则表达式引擎实际上相当差劲(参见:stackoverflow.com/questions/4043307/…)-不幸的是,对于更复杂的任务(以及为非英语单词创建模式),需要更多的代码。尽管如此,对于快速简洁的正则表达式来说,去掉标点符号仍然有效:)

James Shrum 回复 15小时 前

这是最简单的,很好地达到了我的目的。