Regex 使用正则表达式将特定字符串与多个常量匹配

Regex 使用正则表达式将特定字符串与多个常量匹配,regex,Regex,现在,我正在寻找的正则表达式有不同的要求,它太复杂了,我自己无法解决 我需要搜索具有以下要求的特定字符串: 字符串以“fu:开头,以”结尾 在这些开始和结束要求之间,可以存在具有以下要求的任何其他字符串: 2.1。少于50个字符 2.2。仅小写 2.3。没有尾随空格 2.4。“符:”和另一个字符串之间没有空格 正则表达式的结果应该是“1”匹配但“2./2.1/2.2/2.3/2.4”不匹配的情况 目前我有以下正则表达式:“fu:([^”]*?[A-Z][^”]*?)”, 它查找以“fu:开头,以

现在,我正在寻找的正则表达式有不同的要求,它太复杂了,我自己无法解决

我需要搜索具有以下要求的特定字符串:

  • 字符串以“fu:开头,以”结尾

  • 在这些开始和结束要求之间,可以存在具有以下要求的任何其他字符串:

    2.1。少于50个字符

    2.2。仅小写

    2.3。没有尾随空格

    2.4。“符:”和另一个字符串之间没有空格

  • 正则表达式的结果应该是“1”匹配但“2./2.1/2.2/2.3/2.4”不匹配的情况

    目前我有以下正则表达式:
    “fu:([^”]*?[A-Z][^”]*?)”
    , 它查找以
    “fu:
    开头,以
    结尾的字符串,
    ,中间有任何大写字母,如下所示:

    "fu:this String is wrong cause the s from string is upper case"
    
    我希望这一切都是有意义的,我试着进入regex,但对于不是每天都使用regex的人来说,这个问题似乎很复杂

    [编辑]

    显然我不够清楚,我想要的是“错误”的比赛。 我在寻找这个正则表达式的补码:“fu:(?:[a-z][a-z]{0,47}[a-z]|[a-z]{0,2})”

    一些例子:

    比赛:“傅:这是一场比赛”

    比赛:“傅:这是一场比赛”

    比赛:“傅:这是一场比赛”

    没有对手:“傅:这不是对手”

    抱歉,这不容易解释:)

    试试这个:

    "fu:(?:[a-z][a-z ]{0,47}[a-z]|[a-z]?)"
    
    上述正则表达式应符合指定的要求。

    请尝试以下操作:

    "fu:([a-z](?:[a-z ]{0,48}[a-z])?)"
    
    这将匹配以
    “fu:
    开头并以
    结尾的任何字符串,这些字符串之间的字符串将包含1-50个字符-仅小写,不能以空格开头,也不能有尾随空格

    "fu:                    # begins with "fu:
    (                       # group to match
        [a-z]               # starts with at least one character
        (?:                 # non-matching sub-group
            [a-z ]{0,48}    # matches 0-48 a-z or space characters
            [a-z]           # sub-group must end with a character
        )?                  # group is not required
    )
    "                       # ends with "
    
    编辑:如果您也需要一个空字符串来匹配,即完整字符串为
    “fu:
    ,您可以在正则表达式中的匹配组末尾添加另一个

    "fu:([a-z](?:[a-z ]{0,48}[a-z])?)?"
    
    我将两个正则表达式分开(一个允许字符串中包含1-50个字符,另一个允许字符串中包含0-50个字符),以显示细微的差异

    编辑#2:要匹配上面的倒数,即-要查找与所需格式不匹配的所有字符串,可以使用:

    ^((?!"fu:([a-z](?:[a-z ]{0,48}[a-z])?)?").)*$
    
    这将显式匹配与该模式不匹配的任何行。因此,这也将匹配不包含fu:-的行,如果这很重要的话

    我能找出的唯一方法是明确尝试匹配失败的规则,以真正匹配上述相反的内容,并且仍然包括
    “fu:
    的锚:

    "fu:([^a-z].*|[^"]{51,}|[a-z]([^"]*?[A-Z][^"]*?)+|[a-z ]{0,49}[ ])"
    
    此正则表达式将匹配以非小写
    a-z
    字符开头的任何字符串、长度超过50个字符的任何字符串、包含大写字母的任何字符串或具有尾随空格的任何字符串。对于每个附加规则,您都需要更新正则表达式以匹配所需的相反项


    我的建议是,无论您使用何种语言,都要匹配所有符合您要求的输入字符串——如果没有匹配项,则该字符串必须违反您的规则。

    这可能就是您需要的

    "fu:([a-z](?:[a-z ]{,48}[a-z])?)"
    

    将A-Z替换为A-Z以获得小写字母。使用[a-z]{0,50)获得50个小写字符或空格。您允许标点符号吗?您使用的是什么语言?这是完整的PCRE正则表达式还是子集?不确定OP是否希望匹配
    “fu:
    ,因为它满足所有条件。其余看起来不错。不,我的意思是另一个字符串的情况(正如OP定义的)是一个空字符串。我不确定OP是否希望它匹配这一个准确地给了我“正确”匹配。现在我“只是”需要这个正则表达式的补码。我基本上希望所有匹配都是错误的。例如,我想在这个字符串上有一个匹配:“fu:错误”,但在这个字符串上没有“fu:错误”“。如果我不清楚,很抱歉。字符串中允许有空格吗?上面的正则表达式不允许有空格。@Dave上面的正则表达式允许有空格;
    [a-z]
    匹配字符
    a-z
    或`。现在看起来不错。
    {0,2}”
    有点多余,因为2号案例与前一个案例相匹配,但没有弄错。你是对的。这导致我找到了@newfurnity的解决方案:).+1对他来说!字符组将允许字符串中的数字。@nhahtdh正确。问题没有指定禁止数字。我不确定我是否理解OP的问题,但它似乎说只允许小写(和空格-从示例中)。
    "fu:([a-z](?:[a-z ]{,48}[a-z])?)"