替换所有非单词字符,如?*+#

6

我需要帮助将字符串中的所有非单词字符替换掉。

例如,(stadtbezirkspräsident' 应该变成 stadtbezirkspräsident

这个正则表达式应该适用于所有语言,所以有些棘手,因为我不知道如何匹配像 ñ 或者 œ 这样的字符。我尝试用下面这个正则表达式来解决:

string.replace(/[&\/\\#,+()$~%.'":*?<>-_{}]/g,' ');

但是仍然有太多特殊字符,比如 Ø

也许有一般的选择器可以解决这个问题,或者有人之前已经解决过这个问题?


Ø是各种语言(例如丹麦语)中的一个字母 :) - Dominik Honnef
类似于这个问题:https://dev59.com/M3E95IYBdhLWcg3wPrkI。JavaScript正则表达式没有任何本地的Unicode感知匹配器。 - ben author
3个回答

6
如果您自己定义了所有Unicode范围,那么工作量将非常大。使用Steven Levithan的XRexExp包和Unicode附加组件可能更有意义,并利用其Unicode属性快捷方式。请参考:XRexExp package with Unicode add-ons
var regex = new XRegExp("\\P{L}+", "g")
string = XRegExp.replace(string, regex, "")

5
尝试使用技巧
str.replace(/(?!\w)[\x00-\xC0]/g, '')

@TimPietzcker - 我知道,但我的解决方案仅删除低十六进制范围内的特殊字符。 - Ωmega
1
是的,你刚编辑完我的评论吗?好的,但仍有足够多的字符无法被捕捉到(即使在8位ANSI集合中:例如×÷)。 - Tim Pietzcker
答案是错误的,因为它在Latin 1 Supplement中没有区分字母和非字母。此外,问题明确说明:“这个正则表达式应该适用于所有语言”。 - Jukka K. Korpela
@JukkaK.Korpela - 即使\p{L}也不是一个好的选择,因为它是“类别字母”,而不是非单词类。但无论如何,享受你的负评吧...我仍然相信我的解决方案是OP需要的,即使我同意它并不是100%复杂和正确的。 - Ωmega
1
我认为这个答案也不应该被踩。问题定义得不够清晰,无法决定哪种解决方案最好。 - Tim Pietzcker

1
这更像是对Tim Pietzcker答案的评论,但在评论中展示代码很尴尬...这里有一个使用XRexExp包的简单示例:
<p id=orig>Bundespräsident / ß+ð/ə¿α!</p>
<p id=new></p>
<script src="http://cdnjs.cloudflare.com/ajax/libs/xregexp/2.0.0/xregexp-min.js">
</script>
<script src="http://xregexp.com/addons/unicode/unicode-base.js">
</script>
<script>
var regex = new XRegExp("\\P{L}+", "g");
var string = document.getElementById('orig').innerHTML;
string = XRegExp.replace(string, regex, "");
document.getElementById('new').innerHTML = string;
</script>

对于生产使用,您可能需要下载一些基础包和Unicode插件的版本,并在服务器上使用它们。

注意:代码检查未被分类为字母(字母表)的字符。我想这对应于您所说的“单词字符”,尽管自然语言中的单词可能包含连字符、撇号和其他非字母字符。

请注意,字符会添加到Unicode中,字符的类别可能会(很少)更改。但是,该软件包已经得到了良好的维护;它对应于Unicode 6.1(版本6.2已发布,但没有新字母)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接