2011-08-09 20 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; 
} 
相关问题