Regex 使用perl脚本从字符串中删除特殊字符

Regex 使用perl脚本从字符串中删除特殊字符,regex,perl,scripting,perlscript,Regex,Perl,Scripting,Perlscript,我有一根像下面这样的线 stringinput = Sweééééôden@ 我想得到像这样的输出 stringoutput = Sweden 必须删除spl字符和@ 我正在使用 $stringoutput = `echo $stringinput | sed 's/[^a-z A-Z 0-9]//g'`; 我得到的结果类似于Sweôôôden,但ôôô未被删除 您能建议我要添加的内容吗?无需从Perl调用sed,Perl可以自己进行替换。它也更快,因为您不需要启动新流程 #/usr/b

我有一根像下面这样的线

stringinput = Sweééééôden@
我想得到像这样的输出

stringoutput = Sweden
必须删除spl字符
@

我正在使用

$stringoutput = `echo $stringinput | sed 's/[^a-z  A-Z 0-9]//g'`;
我得到的结果类似于
Sweôôôden
,但
ôôô
未被删除


您能建议我要添加的内容吗?

无需从Perl调用sed,Perl可以自己进行替换。它也更快,因为您不需要启动新流程

#/usr/bin/perl
使用警告;
严格使用;
使用utf8;
my$string='Sweôden@';
$string=~s/[^A-Za-z0-9]//g;
打印$string;

您需要在
sed
命令之前使用
LC_ALL=C
使
[A-Za-z]
字符类根据ASCII表创建范围:

stringoutput=$(echo$stringinput | LC_ALL=C sed's/[^A-Za-z0-9]//g')
见:

stringinput='Sweôôden';
stringoutput=$(echo$stringinput | LC_ALL=C sed's/[^A-Za-z0-9]//g');
回显“$stringoutput”;
#=>瑞典
见:

在默认的C语言环境中,排序顺序是本机字符顺序;例如,“[a-d]”相当于“[abcd]”。在其他语言环境中,未指定排序顺序,“[a-d]”可能等同于“[abcd]”或“[abbcdd]”,或者可能无法匹配任何字符,或者它匹配的字符集甚至可能不稳定。要获得括号表达式的传统解释,可以通过将LC_ALL环境变量设置为值“C”来使用“C”语言环境

在Perl中,您可以简单地使用

my$stringinput='Sweôden@;
my$stringoutput=$stringinput=~s/[^A-Za-z0-9]+//gr;
打印$stringoutput;

请参阅。

您需要
stringoutput=$(echo$stringinput | LC_ALL=C sed's/[^A-Za-z0-9]//g')非常感谢。my$stringoutput=$stringinput=~s/[^A-Za-z0-9]+//gr;这起作用了。但当我在regex中添加/时。。因为我不想从stringinput(如PO BOX 29794/MAC™S3929-033)中/发生错误,所以它在下面抛出了一个不匹配的错误[在正则表达式中;标记为@sravanirinija,您在括号内使用了
-
,对吗?将其转义(或放在括号表达式的末尾)。另外,转义
/
我的$stringoutput=$stringinput=~s/[^A-Za-z0-9.,\/-]+//gr;
谢谢。这很有帮助。注意:两者都假设为NFC字符串,但NFD字符串都失败(生成Sweeeeeoden而不是Sweden)。请看我的错误。此注释将自毁。