匹配数字与嵌入的非数字

时间:2016-09-14 18:47:25

标签: regex perl grep

我正在尝试匹配其中包含非数字的数字字符串。使用http://regexr.com/中的默认文本,以下内容应匹配:

v2.1
-98.7
3.141
.6180
9,000 
+42
555.123.4567    
+1-(800)-555-2468

以下匹配:

0123456789
12345

我试过了:

/[^\n\ ]{1,}\d+\S+\d/g

但它与+42不匹配且与012345678912345不匹配,并将"555.123.4567 +1-(800)-555-2468"视为一个字符串。

我尝试通过在末尾放置一个$来缓解它,但没有任何匹配。不确定我做错了什么。

4 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式匹配任何至少有一个非数字的文本:

/^\d*[^\d\n]+\d.*$/mg

RegEx Demo

RegEx分手:

  • ^ - 开始
  • \d* - 匹配0位或更多位数
  • [^\d\n]+ - 匹配任何不是数字且不是换行符的字符中的1个或多个
  • \d - 匹配数字
  • .* - 匹配任何字符的0或更多
  • $ - 结束

答案 1 :(得分:0)

试试这个:

^(?=.*\d)(?=.*[^\d\s])\S+$

这意味着“至少有一个数字,一个非数字,没有空格”。

请参阅live demo

如果您的输入中没有换行符,则可以稍微简单一些:

^(?=.*\d)(?=.*\D)\S+$

答案 2 :(得分:0)

看起来你想要躲避完全由数字或完全由字母组成的字符串。所以你可以排除这些。这也将在没有任何数字的字符串中出现,因此也需要一个数字。

my $exclude = qr/(?: [0-9]+ | [A-Za-z]+ )/x;
my @res = grep { not /^$exclude$/ and /\d/ } @strings;

如果需要排除任何其他字符(下划线?),请将其添加到列表中。

目前尚不清楚你的输入是如何产生的,这需要一个准备好的字符串列表。添加单词边界和/或/s,具体取决于输入。或者将输入解析为字符串列表。

如果输入来自多行字符串my @strings = split '\n|\s+', $text;

答案 3 :(得分:0)

你是不是大概过度思考?使用/\D/匹配包含非数字的字符串有什么问题?

我不确定您的具体要求是什么,但如果您要查找的字符串至少包含一位数字且至少包含一位非数字,那么最简单的方法是使用正则表达式匹配 - {{ 1}}。

/\d/ && /\D/