7

从字符串中删除所有特殊字符的最佳方法是什么 - 如下所示:

!@#$%^&*(){}|:"?><,./;'[]\=-

删除了这些字符的项目会很短,那么在每个项目上使用 REGEX 还是只使用字符串操作会更好吗?

谢谢

环境 == C#/.NET

4

9 回答 9

6

拥有白名单通常比拥有黑名单更好。

正则表达式有一个方便\w的方式,有效地表示字母数字加下划线(某些变体还会在列表中添加重音字符(á、é、ô 等),而其他变体则不会)。

您可以通过使用\Wto 表示非字母数字的所有内容来反转它。

所以用空字符串替换将删除所有“特殊”字符。\W


或者,如果您确实需要一组与字母数字不同的字符,您可以使用否定字符类:[^abc]将匹配不是aorb的所有内容c[^a-z]并将匹配不在范围内的所有内容a,b,c,d...x,y,z

等价于\wis[A-Za-z0-9_]和因此\W[^A-Za-z0-9_]

于 2009-02-09T14:53:58.850 回答
3

在 php 中:

$tests = array(
     'hello, world!'
    ,'this is a test'
    ,'and so is this'
    ,'another test with /slashes/ & (parenthesis)'
    ,'l3375p34k stinks'
);

function strip_non_alphanumerics( $subject )
{
    return preg_replace( '/[^a-z0-9]/i', '', $subject );
}

foreach( $tests as $test )
{
    printf( "%s\n", strip_non_alphanumerics( $test ) );
}

输出将是:

helloworld
thisisatest
andsoisthis
anothertestwithslashesparenthesis
l3375p34kstinks
于 2009-02-09T14:59:02.253 回答
2

我更喜欢正则表达式,因为语法更易于阅读和维护:

# in Python
import re
re.sub("[abcdef]", "", text)

要删除abcdef正确转义字符在哪里。

或者,如果您只想要字母数字字符(加上下划线),您可以使用:

re.sub("\W", "", text)

其中\W表示一个非单词字符,即[^a-zA-Z_0-9]

于 2009-02-09T14:56:21.167 回答
1

当您只想拥有字母数字字符时,您可以通过使用反转字符类来表达这一点:

[^A-Za-z0-9]+

这意味着:每个不是字母数字的字符。

于 2009-02-09T14:56:42.837 回答
1

这是一个简单的正则表达式

[^\w]

这应该捕获所有非单词字符这将允许 az AZ 0-9 空格和 _ 既不是空格也不是 _ 不在您的列表中,所以如果您也想捕获这些,这可以工作,那么我会做这样的事情:

/[a-z0-90/i

这是 az 和 0-9 的 PHP 格式,i 使其不区分大小写。

于 2009-02-09T15:04:42.257 回答
0

我们使用“tr”命令?

你不说你在什么环境......壳?C程序?爪哇?每一个都有不同的最佳解决方案。

于 2009-02-09T14:53:05.607 回答
0

你用什么语言做正则表达式?

例如,在 Perl 中,您可以进行翻译,将列表中的任何字符翻译为空:

例如,这会将 'a'、'b'、'c' 或 'd' 翻译成 ''

$sentence =~ tr/abcd//;
于 2009-02-09T14:56:08.080 回答
0

您可以通过获取键入字符的 askey 值在前端验证它们。

于 2009-02-09T16:50:08.710 回答
0

PHP 中的理想方法是......

$text = "ABCDEF...Á123";
$text = preg_replace( '/[^\p{L}]/i', '', $text);
print($text); # Output: ABCDEFÁ

或者,在 Perl...

my $text = "ABCDEF...Á123";
$text =~ s/[^\p{L}]//gi;
print($text); # Output: ABCDEFÁ

如果你只是在 [^a-zA-Z] 上匹配,你会错过所有重音字符,我想你会想要保留这些字符(大部分情况下)。

于 2016-05-05T16:41:34.550 回答