使用Regex将特定字符串与几个常量匹配

时间:2012-08-14 13:48:39

标签: regex

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

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

  1. 字符串以“fu:and ends with”

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

    2.1。少于50个字符

    2.2。只有小写

    2.3。没有尾随空格

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

  4. 正则表达式的结果应该是这样的情况:没有'1匹配但是没有'2/2/2/2.2/2/2.4的情况没有。

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

    "fu:this String is wrong cause the s from string is upper case"
    

    我希望这一切都有道理,我试图进入正则表达式,但对于那些每天都没有使用正则表达式的人来说,这个问题似乎很复杂。

    [编辑]

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

    一些例子:

    匹配:“fu:这是一场比赛”

    匹配:“fu:这是匹配”

    匹配:“fu:这是一场比赛”

    不匹配:“fu:这不匹配”

    抱歉,这不容易解释:)

4 个答案:

答案 0 :(得分:2)

尝试以下方法:

"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个字符的字符串,包含大写字母的任何字符串或任何包含尾随字符的字符串空白。对于每个附加规则,您需要更新正则表达式以匹配所需的相反。

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

答案 1 :(得分:0)

试试这个:

"fu:(?:[a-z][a-z ]{0,47}[a-z]|[a-z]?)"

答案 2 :(得分:0)

"fu:([^A-Z" ](?:[^A-Z"]{0,48}[^A-Z" ])?)"

上述正则表达式应符合指定的要求。

答案 3 :(得分:0)

这可能就是你所需要的

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