繁体   English   中英

如何使用正则表达式匹配大多数非数字?

[英]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

您可以使用否定的前瞻来断言右边的不是字符串的开头,后跟连字符。

然后匹配一个可选的连字符,后跟1+倍而不是数字。

(?!^-)\D+

说明

  • (?!^-)向超前 ,断言直接在右边的不是字符串的开头,后跟连字符
  • \\D+匹配1+次而不是数字

正则表达式演示

或匹配没有数字的单词字符,可以使用:

(?!^-)[^\W\d]+

此模式的最后一部分:

  • [^\\W\\d]+否定的字符类别以匹配除数字之外的单词字符

正则表达式演示

您有^[^-]|[^\\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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM