[英]How to match most non-digits using regex?
我想替换字符串中除前导减号( -
)之外的所有非数字字符。
例如, hu
应从被删除-123hu8
,和-jk
应从被删除34-jk8
。
我正在使用以下正则表达式,但是它不起作用。
^[^-]|[^\d\.]
有什么我想念的吗?
由于环视费用昂贵,
(?!^-)\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
您有^[^-]|[^\\d\\.]
在某些语言中,未实现对字符类(例如\\d
)的支持。 您使用什么语言? 使用[^0-9\\.]
可能会更好。
您有^[^-]
匹配任何不以-
开头的字符串,其中包括数字,因此数字的第一位将被压缩。 您要替换-
仅当它后面没有数字时才替换。
请注意,您的表达式仅匹配一个字符,因此您需要递归应用它来修改整个字符串。 或者,您可以使用“ +”或“ *”来匹配多个字符。 如果您在其中使用了几行代码,我们可能会更好地为您提供帮助。
从概念上讲,提取数字部分并丢弃字符串的其余部分会更简单,但这听起来像您希望将34-jk8
变成348
。 你会如何处理领先-
如-jk348
?
$_='-123hu8-34-jk8'
s/[^\d-]+//g
print $_
古努塞德
echo '-123hu8-34-jk8'| sed -E 's/[^-0-9]//g'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.