C# 仅当模式的长度大于某个值时,才使用正则表达式匹配该模式

C# 仅当模式的长度大于某个值时,才使用正则表达式匹配该模式,c#,regex,string-matching,C#,Regex,String Matching,我有两个字符串,我想知道 如果字符串2在 相同顺序 此子集的最小大小由我确定 例如: string 1 = stackoverflow <br>minimun size = 5 string 2a = stack (MATCH) string 2b = stac (DO NOT MATCH) string 2c = staov (MATCH) string 2d = staZov (DO NOT MATCH) string 2e = eflow (MATCH) string 2

我有两个字符串,我想知道

  • 如果字符串2在 相同顺序

  • 此子集的最小大小由我确定

  • 例如:

    string 1 = stackoverflow
    <br>minimun size = 5
    
    string 2a = stack (MATCH)
    string 2b = stac  (DO NOT MATCH)
    string 2c = staov (MATCH)
    string 2d = staZov (DO NOT MATCH)
    string 2e = eflow (MATCH) 
    string 2f = ewolf (DO NOT MATCH)
    string 2g = somethingstacksomething (MATCH) 
    
    string 1=stackoverflow
    
    最小尺寸=5 字符串2a=堆栈(匹配) 字符串2b=stac(不匹配) 字符串2c=staov(匹配) 字符串2d=staZov(不匹配) 字符串2e=eflow(匹配) 字符串2f=ewolf(不匹配) 字符串2g=somethingstacksomething(匹配)
    我正在以编程方式构建正则表达式,因此问题的第一部分可以用表达式来解决:
    (s)?(t)?(a)?(c)?(k)?(o)?(v)?(e)?(r)?(f)?(l)?(o)?(w)?

    但我不知道如何应用“最小字符”规则。可以用正则表达式来做吗

    提前谢谢


    编辑:添加另一个示例以完成问题说明。另外,如果您想知道,这是评估用户指定的密码强度的方法的一部分。如果他定义了一个从其他信息(登录名、出生日期、姓名等)派生的密码,我们应该警告他。

    您可以添加一个前瞻,确保有五个字符:
    (?=.{5})s?t?a?c?k?o?v?e?r?f?l?o?w?

    但我不知道如何应用“最小字符”规则

    在确定可能的匹配项之后。您需要确定结果的长度


    您只需使用String.Length即可确定该值。

    有趣的问题!有一种方法可以做到(但你不会喜欢的)。它会导致一个潜在的大(可能是慢)正则表达式。假设
    string1
    ABCD
    。下面是所有不同长度要求的正则表达式:

    length=4;
    正则表达式=@“
    ABCD
    ";
    长度=3;
    正则表达式=@“
    ABCD?
    |ABC?D
    |AB?CD
    |卡介苗
    ";
    长度=2;
    正则表达式=@“
    ABC?D?
    |AB?CD?
    |AB?C?D
    |A?BCD?
    |公元前
    |A?B?CD
    ";
    长度=1
    正则表达式=@“
    [ABCD]
    ";
    
    我还没有考虑过如何用编程的方式来组装它,但我相信它是可以做到的。然而,一个具有大量OR'ed替代项的大型正则表达式可能比使用当前使用的“匹配然后检查匹配字符串的长度”方法要慢


    我在这件事上摸了好一阵子头脑,我很确定没有简单/聪明的正则表达式构造能满足您的要求。

    您想用正则表达式这样做有什么原因吗?这种方法似乎效率不高。有一刻我认为它可以解决这个问题,但后来a意识到,字符串(如“stac1”)也是匹配的。你可以通过锚定正则表达式来解决这个问题:
    ^…$
    你是对的@SLarks,但现在我发现我的问题描述根本不完整。如果字符串2的子字符串符合正则表达式,则字符串2(要测试的字符串)必须匹配,因此锚定不会解析它。我将纠正我的错误并更改原始帖子。@marcel:将可选字符放入一个组中,然后检查组的长度(如果正则表达式匹配)<代码>(s?t?a?c?k?o?v?e?r?f?l?o?w?)
    if(match.Groups[1].Length>5)
    Yes,在我的代码中我会这样做。在我的例子中,我必须遍历每一个匹配项并查看长度。如果可能的话,我只是想在正则表达式阶段寻找一些方法来进行“大小检查”。