Regex 正则表达式如何匹配长度固定且至少包含一个数字的字符串

Regex 正则表达式如何匹配长度固定且至少包含一个数字的字符串,regex,Regex,我需要匹配一个长度为10的字符串(除空格外的任何字符或符号),其中至少有一个数字(但位置不确定)。最简单的方法是什么?谢谢!(最好使用Perl正则表达式,但实际上任何正则表达式都会对此有所帮助。) 满足要求的一些示例字符串: ABCD1EFGH2 AGD-D.D8HD 1414151502 [TT]88daJh ABCDEFGHIJ # no digit EGEGE_(**/ # no digit asdgja8G # too short @#21

我需要匹配一个长度为10的字符串(除空格外的任何字符或符号),其中至少有一个数字(但位置不确定)。最简单的方法是什么?谢谢!(最好使用Perl正则表达式,但实际上任何正则表达式都会对此有所帮助。)

满足要求的一些示例字符串:

ABCD1EFGH2
AGD-D.D8HD
1414151502
[TT]88daJh
ABCDEFGHIJ        # no digit
EGEGE_(**/        # no digit
asdgja8G          # too short
@#21-GDKJGDE      # too long
一些不符合要求的样品:

ABCD1EFGH2
AGD-D.D8HD
1414151502
[TT]88daJh
ABCDEFGHIJ        # no digit
EGEGE_(**/        # no digit
asdgja8G          # too short
@#21-GDKJGDE      # too long
谢谢

更新:要清楚,这是一个搜索。输入字符串有数千个字符长。我需要匹配所有10个字符的“单词”,其中有一个数字。您可以想象一个字符串,它包含以上8个单词,并由空格和制表符分隔。希望搜索只选择前4个。谢谢


更新的更新:为没有再次明确表示歉意(希望简化案件,但未能排除其他解释)。此正则表达式搜索的用法将是较长匹配的一部分。一个10字符的单词,后面至少有一个数字和一个4字符的单词,等等。。。因此,将长字符串拆分为第一步并不十分有效。

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

/(?<!\S)(?=\S{10}(?!\S))\S*\d\S*/
…这里是一个现场的(其中还包括评论中讨论的优化)

在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);
}

将lookback替换为
(?:\s |^)
意味着我现在正在使用前导空格字符。要单独提取单词,我使用
()
捕获它,并使用
匹配[1]
检索它

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

/(?<!\S)(?=\S{10}(?!\S))\S*\d\S*/
…这里是一个现场的(其中还包括评论中讨论的优化)

在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);
}

将lookback替换为
(?:\s |^)
意味着我现在正在使用前导空格字符。要单独提取单词,我使用
()
捕获它,并使用
匹配[1]
检索它

我们可以通过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;
}
var string\u array=sourceString.split(“”)//按空间分割
var-arrayIndex=0;
while(arrayIndex
我们可以通过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;
}
var string\u array=sourceString.split(“”)//按空间分割
var-arrayIndex=0;
while(arrayIndex
\S*\d\S*
可以工作,但会进行大量回溯,这可能是OP的长字符串的问题。另一个简单的选择是
[^\s\d]*\d\s*
@Chris:我没有讨论这个问题,因为我不想分散大家对重点的注意力:如何准确找到十个字符的“单词”。不过,如果我要添加这种优化,我会使用-
[^\s\d]*+\d\s*
(仅限Perl 5.10+)-或-
(?>[^\s\d]*)\d\s*
-来完全消除回溯。
\s*\d\s*
可以工作,但会进行大量回溯,这对于OP的长字符串来说可能是个问题。另一个简单的选择是
[^\s\d]*\d\s*
@Chris:我没有讨论这个问题,因为我不想分散大家对重点的注意力:如何准确找到十个字符的“单词”。但是,如果要添加该优化,我会使用-
[^\s\d]*+\d\s*
(仅限Perl 5.10+)-或-
(?>[^\s\d]*)\d\s*
-来完全消除回溯。