我如何正则表达式匹配一个固定长度的字符串,其中至少有一个数字

时间:2011-08-09 03:59:49

标签: regex

我需要匹配一个字符串(除空格之外的任何字符或符号),长度为10,并且至少包含一个数字(但不确定的位置)。最简单的方法是什么?谢谢! (最好是在Perl Regex中,但实际上任何正则表达式都会对它有所了解。)

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

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

某些不符合要求的样品:

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

THX!

更新:要清楚,这是一个搜索。输入字符串长度为数千个字符。我需要匹配所有带有数字的10个字符“单词”。您可以想到一个字符串,其中包含由空格和制表符分隔的所有上述8个单词。想要只搜索前4个的搜索。 THX!

更新更新:为不再清楚而道歉(想要简化案例,但未能排除其他解释)。此正则表达式搜索的用法将是较长匹配的一部分。例如。一个10个字符的单词,其中至少有一个数字后跟一个4个字符的单词等等......所以将长字符串拆分为第一步并不会有效。

2 个答案:

答案 0 :(得分:4)

这是一个非常重要的澄清;在较大的字符串中查找您描述的字符串类型与匹配独立字符串完全不同,而且要复杂得多。我认为最简单的方法是使用外观:

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

(?<!\S)匹配一个前面没有非空白字符的位置。

(?=\S{10}(?!\S))进一步断言该位置后面紧跟着10个非空白字符。

一旦满足了外观,\S*\d\S*就会消耗字符串,假设至少有一个字符是数字。

这适用于Perl和大多数Perl派生的风格,如Python,Java和.NET,但不支持JavaScript,它不支持lookbehinds。


编辑:以下是一个示例,说明如何遍历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|^)替换lookbehind意味着我现在正在消耗领先的空白字符。要单独提取单词,我会使用()捕获它并使用match[1]检索它。的 demo

答案 1 :(得分: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;
}