2016-09-14 36 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 
相關問題