2016-09-14 38 views
1

我想匹配其中包含非数字的数字字符串。使用http://regexr.com/默认的文本,下面应符合:匹配数字与非数字嵌入

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

下应该比赛:


12345 

我想:

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

,但它不会匹配+42并且它错误地匹配了12345,并且它处理了"555.123.4567 +1-(800)-555-2468"作为一个字符串。

我试图通过在最后加上$来减轻它的负担,但是这并不匹配。不知道我做错了什么。

回答

2

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

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

RegEx Demo

正则表达式破碎:

  • ^ - 启动
  • \d* - 匹配0或更多位数
  • [^\d\n]+ - 第1或多个任意字符不是一个数字,而不是一个新行
  • \d - 匹配的一个数字
  • .* - 第0个或多个的任何字符
  • $的 - 最终
+0

我应该评论它也匹配一个非数字字符串。就像一句话。 – revo

+0

标题是*与嵌入的非数字匹配的数字*。所以我认为建议的正则表达式不应该匹配没有数字的行。你的匹配'test'。 – revo

+0

是的,但它似乎是一个混合物。 – revo

0

试试这个:

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

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

请参阅live demo。像你想完全由或数字,字母完全达到躲闪串

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

你的第一个正则表达式匹配只有数字的字符串,但第二个正常。 – revo

+0

@revo第一个工程,如果没有新行 - 请参阅[现场演示](http://rubular.com/r/v75FK3nMnV) – Bohemian

+0

只有当没有新行。你可以避免它'^(?=。* \ d)(?=。* \ D(?!^))\ S + $' – revo

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;

0

难道你不是过度思考这个问题吗?使用/\D/来匹配包含非数字的字符串有什么问题?

我不确定你的具体要求是什么,但是如果你正在寻找一个至少包含一位数字和至少一个非数字的字符串,那么最简单的方法是使用正则表达式匹配 - /\d/ && /\D/

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

while (<DATA>) { 
    chomp; 
    say "$_: " . (/\d/ && /\D/ ? 'matches' : 'doesn\'t match'); 
} 

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

12345 
相关问题