我想替换字符串中除前导减号(-
)之外的所有非数字字符。
例如,应将hu
中的-123hu8
和-jk
中的34-jk8
删除。
我正在使用以下正则表达式,但不起作用。
^[^-]|[^\d\.]
有什么我想念的吗?
答案 0 :(得分:2)
因为环顾四周很昂贵,
(?!^-)\D+
可能比
慢(?:^-?+|\d++)\K\D+
我不知道这对您是否重要。
测试:
>perl -e"CORE::say $ARGV[0] =~ s/(?:^-?+|\d++)\K\D+//rg;" -- -123hu8
-1238
>perl -e"CORE::say $ARGV[0] =~ s/(?:^-?+|\d++)\K\D+//rg;" -- 123hu8
1238
>perl -e"CORE::say $ARGV[0] =~ s/(?:^-?+|\d++)\K\D+//rg;" -- a123hu8
1238
>perl -e"CORE::say $ARGV[0] =~ s/(?:^-?+|\d++)\K\D+//rg;" -- -a123hu8
-1238
>perl -e"CORE::say $ARGV[0] =~ s/(?:^-?+|\d++)\K\D+//rg;" -- 34-jk8
348
答案 1 :(得分:1)
您可以使用否定的前瞻来断言右边的字符不是字符串的开头,后跟连字符。
然后匹配一个可选的连字符,后跟1+倍而不是数字。
(?!^-)\D+
说明
(?!^-)
负数lookahead,断言直接在右边的不是字符串的开头,后跟连字符\D+
匹配1次以上而不是数字或者匹配不带数字的单词字符,您可以使用:
(?!^-)[^\W\d]+
此模式的最后一部分:
[^\W\d]+
与character class取反,以匹配除数字以外的文字字符答案 2 :(得分:0)
您有^[^-]|[^\d\.]
在某些语言中没有实现对字符类(例如\d
)的支持。您使用什么语言?使用[^0-9\.]
可能会更好。
您有^[^-]
匹配任何不以-
开头的字符串,该字符串包含数字,因此数字的第一位将被压缩。您只想在-
后面没有数字时替换它。
请注意,您的表达式仅匹配一个字符,因此您需要递归应用它来修改整个字符串。或者,您可以使用“ +”或“ *”来匹配多个字符。如果您在其中使用了几行代码,我们也许可以为您提供更好的帮助。
从概念上讲,提取数字部分并扔掉字符串的其余部分会更简单,但这听起来像您希望34-jk8
变成348
。您将如何处理诸如-
之类的前导-jk348
?
答案 3 :(得分:0)
$_='-123hu8-34-jk8'
s/[^\d-]+//g
print $_
gnu sed
echo '-123hu8-34-jk8'| sed -E 's/[^-0-9]//g'