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

时间:2019-04-03 15:00:34

标签: javascript python regex perl

我想替换字符串中除前导减号(-)之外的所有非数字字符。

例如,应将hu中的-123hu8-jk中的34-jk8删除。

我正在使用以下正则表达式,但不起作用。

^[^-]|[^\d\.]

有什么我想念的吗?

4 个答案:

答案 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次以上而不是数字

regex demo

或者匹配不带数字的单词字符,您可以使用:

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

此模式的最后一部分:

  • [^\W\d]+character class取反,以匹配除数字以外的文字字符

Regex demo

答案 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'