2011-08-09 21 views
0

我需要匹配一個字符串(任何字符或空間以外的符號)長度爲10和至少一個數字(但不確定的位置)在它。最簡單的方法是什麼?謝謝! (最好是在Perl的正則表達式,但任何真正的正則表達式將它線索。)我如何匹配一個固定長度的字符串和至少一個數字在它

符合要求的一些示例字符串:

ABCD1EFGH2 
AGD-D.D8HD 
1414151502 
[TT]88daJh 

有些樣品不符合要求:

ABCDEFGHIJ  # no digit 
EGEGE_(**/  # no digit 
asdgja8G   # too short 
@#21-GDKJGDE  # too long 

Thx!

更新:要清楚,這是一個搜索。輸入字符串具有數千個字符。我需要找出所有10個字符中包含數字的「單詞」。您可以考慮一個字符串,其中包含由空格和製表符分隔的所有8個以上單詞。想要搜索只挑出前4個。謝謝!

UPDATE更新:道歉不再清楚(想簡化案件,但未能排除其他解釋)。這個正則表達式搜索的用法將是更長匹配的一部分。例如。一個10個字符的單詞,至少有一個數字,後面跟着一個4個字符的單詞等等。因此,第一步分割長字符串將不太合適。

回答

4

這是一個非常重要的說明;在較大的字符串中找到您描述的字符串類型與匹配獨立字符串是非常不同的任務,而且要複雜得多。我認爲這樣做最簡單的方法是用lookarounds:

/(?<!\S)(?=\S{10}(?!\S))\S*\d\S*/ 

(?<!\S)不是由一個非空白字符前面的位置相匹配。

(?=\S{10}(?!\S))進一步斷言該位置後面緊跟着10個非空白字符。

一旦查找得到滿足,\S*\d\S*繼續前進並消耗字符串,假設至少有一個字符是數字。

這將適用於Perl和大多數Perl派生的風格,如Python,Java和.NET,但不適用於不支持lookbehinds的JavaScript。


編輯:這裏是展示如何通過在Perl所有比賽迭代的例子:

while ($subject =~ m/(?<!\S)(?=\S{10}(?!\S))\S*\d\S*/g) { 
    print("$&\n"); 
} 

...這是一個活的demo(其中還包括在討論的優化註釋)。

在JavaScript中我會使用一個稍微不同的正則表達式:

var regex = /(?:\s|^)(?=\S{10}(?!\S))([^\d\s]*\d\S*)/g; 
var match = regex.exec(subject); 
while (match != null) { 
    print(match[1]); 
    match = regex.exec(subject); 
} 

(?:\s|^)更換回顧後意味着現在我消耗了領先的空白字符。爲了單獨提取這個詞,我用()捕獲它並用match[1]檢索它。demo

+1

'\ S * \ d \ S *'的作品,但會做很多回溯,這可能是OP的長字符串的問題。一個簡單的選擇是'[^ \ s \ d] * \ d \ S *' –

+0

@Chris:我沒有深入,因爲我不想分散注意力的主要觀點:如何準確地找到 - 十個字符的「單詞」。如果我想添加這個優化,我會用[佔有量詞](http://www.regular-expressions.info/possessive.html) - '[^ \ s \ d] * + \ d \ S *'(僅用於Perl 5.10+) - 或[原子組](http://www.regular-expressions.info/atomic.html) - '(?> [^ \ s \ d] *)\ d \ S *' - 完全消除回溯。 –

0

我們可以實現上述在JavaScript如下:

拆分,並通過您sourceString爲迭代:

var string_array=sourceString.split(" "); //split on basis of space 
var arrayIndex=0; 
while (arrayIndex < string_array.length) //iterate 
{ 

    var tempString = string_array[arrayIndex]; 
    if(tempString.length == 10)   //if length is 10 
    { 
     if(tempString.match(/^\d+$/)!= -1) //if it contains more than 1 digit 
     { 
       //do your stuff 
       alert(tempString); 
     } 
    } 
    arrayIndex+=1; 
} 
相關問題