如果我有一个字符串,其中包含任何类型的非字母数字字符:
"This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation"
如何在JavaScript中获得它的无标点版本:
"This is an example of a string with punctuation"
如果您想从字符串中删除特定标点,最好明确删除您想要的内容
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控制台中运行代码的结果:
正则表达式中的花括号将量词应用于前面,因此在本例中,它将替换2到100个空格字符(\s
)只有一个空格。如果要将任意数量的空白字符压缩为一个,则可以去掉上限,如下所示:replace(/\s{2,}/g, ' ')
.
我在替换的标点符号列表中又添加了几个字符(@+?><[]+
):replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()@\+\?><\[\]\+]/g, '')
。如果有人想要更完整的一套。
Python的字符串。标点将标点定义为:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
这对我来说更好,所以另一种选择是:replace(/['!"#$%&\\'()\*+,\-\.\/:;<=>?@\[\\\]\^_`{|}~']/g,"");
我想你失踪了[]
从标点符号列表中。
我认为... ,-\/ ...
在你的正则表达式中是误导性的。这个-
这里的解释类似于范围运算符。您需要:... ,\-\/ ...
。在这种情况下,这没有什么区别,因为你试图做到全面,但如果你想删除句号,例如,它将不起作用(因为句号在范围内)
@我同意这是一种误导。更新了答案。谢谢
@MikeGrace但现在是两次:-)
@AntoineLizée,这就是我没有仔细阅读所有代码的原因。
@MikeGrace但当你有“短信”时该怎么办。您的替换将同时删除该单词。
我试过“它?”-不适合我(regex101.com/r/F4j5Qc/1),正确的解决方案是:/[,\/#!$%\ ^&*;:{}=\-\u`~()\?]/g
我知道这太老了,但谢谢你!必须找出for循环需要反向运行的困难原因:)
我想指出的是,如果你想删除[
和]
然后您需要将它们添加到[]
,如下所示:/[\[\]?.,\/#!$%\^&\*;:{}=\-_
~()]/g`
这是一个糟糕的答案。问题是“我如何删除?”所有标点符号从字符串?,而不是“如何从字符串中删除特定字符?是的,这个模式有一个有效的用例,但如果没有更好的解释,它不应该是最受欢迎的答案。
2020年更新:所有浏览器现在都支持regexp中的unicode字符类。。。var punctuationless = s.replace(/[^\p{L}\s]/gu,"");
今天到处都能用。
str = str.replace(/[^\w\s\']|_/g, "")
.replace(/\s+/g, " ");
删除除字母数字字符和空格外的所有内容,然后将多个相邻空格折叠为单个空格。
详细说明:
\w
是任何数字、字母或下划线。\s
是任何空格。[^\w\s\']
不是数字、字母、空格、下划线或单引号的任何内容。[^\w\s\']|_
与#3相同,只是在后面添加了下划线。
这也将剔除非英语但在其他方面非常完美的字母数字字符,如a,é,ö,以及整个西里尔字母表。
@很抱歉,我不同意,原来的问题没有具体说明“仅限英语”。因此,它是相当国际化的,在全世界使用。任何说英语并能上网的人都可以使用它。如果问题中没有具体说明语言,那么我们就不应该做出任何假设。我们在2017年,该死!
此外,即使你只支持英语,你也会有像简历这样的借词和地名或人名,这样你就不会想破坏某人在圣何塞工作(官方拼写)的能力。
这会影响以下文字:wouldn't
和don't
第二个是什么.replace(/\s+/g, " ");
在这里完成?
@njboot它将多个相邻空格折叠为单个空格。
同意,@null。已更正。
这不适用于它:(.text=“狐狸问鹳,‘汤怎么样?’”,
如果要去掉所有标点,请将第一个表达式中的正则表达式替换为。。/[^\w\s]/g
以下是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
对于Unicode标点,块是不够的。你必须看看一般的类别标点,你会发现并不是所有的标点都很好地位于这些块中。例如,在拉丁语块中有许多熟悉的标点符号。
非常有用的答案,可能不适用于某些语言的极端情况,但比早期的更好!谢谢
/[^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阿拉伯语、汉语等也将消失。
谢谢,我没有完全想过。
我遇到了同一个问题,这个解决方案做到了这一点,并且可读性很强:
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.
通过添加_u(下划线),您也可以否定这一点。
使其在全球范围内应用/g
,然后可以在其中运行任何字符串并清除标点:
/[^_\W]+/g
漂亮干净;)
也可以使用此方法将所有新行更改为空格。
此方法仅适用于英语,删除所有重音字符。
@NicolasBernier是的,这是百分之百正确的-JavaScript的正则表达式引擎实际上相当差劲(参见:stackoverflow.com/questions/4043307/…)-不幸的是,对于更复杂的任务(以及为非英语单词创建模式),需要更多的代码。尽管如此,对于快速简洁的正则表达式来说,去掉标点符号仍然有效:)
这是最简单的,很好地达到了我的目的。