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

Posted

技术标签:

【中文标题】如何正则表达式匹配具有固定长度且其中至少有一个数字的字符串【英文标题】:how do I regex match a string with fixed length and at least a digit in it 【发布时间】:2011-10-22 21:39:49 【问题描述】:

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

部分满足要求的示例字符串:

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 个字符的单词,等等...所以第一步拆分长字符串是行不通的。

【问题讨论】:

【参考方案1】:

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

/(?<!\S)(?=\S10(?!\S))\S*\d\S*/

(?&lt;!\S) 匹配前面没有非空白字符的位置。

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

一旦环视得到满足,\S*\d\S* 就会继续使用字符串,假设至少有一个字符是数字。

这将适用于 Perl 和大多数 Perl 派生的风格,如 Python、Java 和 .NET,但不适用于不支持后视的 javascript


编辑:这是一个展示如何在 Perl 中遍历所有匹配项的示例:

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

...这是一个现场 demo(其中还包括 cmets 中讨论的优化)。

在 JavaScript 中,我会使用稍微不同的正则表达式:

var regex = /(?:\s|^)(?=\S10(?!\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

【讨论】:

\S*\d\S* 有效,但会进行大量回溯,这可能是 OP 的长字符串的问题。一个简单的替代方案是[^\s\d]*\d\S* @Chris:我没有深入讨论,因为我不想将注意力从主要观点上转移开:如何准确地找到十个字符的“单词”。但是,如果我要添加该优化,我会使用 possessive quantifier - [^\s\d]*+\d\S*(仅限 Perl 5.10+) - 或 atomic group - (?&gt;[^\s\d]*)\d\S* - 完全消除回溯。【参考方案2】:

我们可以在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;

【讨论】:

以上是关于如何正则表达式匹配具有固定长度且其中至少有一个数字的字符串的主要内容,如果未能解决你的问题,请参考以下文章

js的正则表达式要求必须字母与数字组合至少有一个大写字母,要怎么写

java 正则表达式 如何匹配固定长度的数字

正则表达式匹配具有不同数字和最小长度的数字

正则表达式部分实例 2020-6-28

正则表达式:“密码必须至少有以下 4 个中的 3 个”

正则表达式