正则表达式:去除所有非字母数字字符,但保留一些特殊字符。

3

我有这段代码,它将所有非字母数字字符替换为"-"字符。

return Regex.Replace(strIn, @"[\W|_]+", "-", RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase);

但我需要更改它以允许通过一些特殊字符(一个或多个),例如:#,*,%

如何更改这个正则表达式?

6个回答

4

使用

[^\p{L}\p{N}#*%]+

这将匹配一个或多个既不是字母也不是数字,也不是#*%中任何一个字符的字符。


无法使其工作 :( : 解析"[^\pL\pN#*%]+" - \p{X}字符转义格式错误。 - Alexei
尝试使用[^\p{L}\p{N}#*%]+。当属性名称只有一个字母时,它应该可以在没有括号的情况下工作,但是在.NET中,当它位于另一个字符类中时,似乎需要括号。 - Alan Moore
1
啊,是的,看起来.NET需要更冗长的\p{L}语法。我会更新的。 - Tim Pietzcker
更正:.NET似乎需要所有时间使用大括号。太令人失望了! - Alan Moore

2
这个怎么样:
[^a-zA-Z0-9#*%]+

如果您正在使用Unicode,可以按照Tim的回答进行操作:
[^\p{L}\p{N}#*%]+

2
取决于您是否认为 Ä 是一个字母。.NET 认为是,并将其包含在 \w 中。 - Tim Pietzcker
如果文本是俄语的话,这将不起作用(而且它确实是) - Alexei

2

1

使用这个。

([^\w#*%]|_)

在 % 后添加任何其他特殊字符。

它基本上是说,匹配任何不是(^)单词字符(\w),#,*或%的字符,或者匹配 _。


下划线呢?现在不允许使用,但在原始问题的正则表达式中是允许的。 - Tim Pietzcker
这不太好,它让我留下了很多“-”字符 :( - Alexei

1

看起来这种方式对你来说是最好的解决方案

@"(?!.*[^\w#*%])"

我不这么认为。(?!.*[^\w#*%])的意思是,“从当前位置向前查找,没有一个字符与[\w#*%]不匹配”。它不需要任何字符存在,因此它总是匹配的,并且它不会消耗任何字符,因此它不能用于删除任何内容。 - Alan Moore

0
你可以使用集合减法来实现这个功能:
@"[\W_-[#*%]]+"

这个正则表达式匹配所有非单词字符和下划线,减去 #*% 这些字符。

请注意,在字符类中不必使用 | 表示“或”,因为这是隐含的。实际上,你的正则表达式中的 | 只匹配 | 字符本身。

另外请注意,在 .NET 中,\w 匹配除了下划线以外的一些“连接标点符号”字符。如果你想要匹配这些字符,可以使用

@"[\W\p{Pc}-[#*%]]+"

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