RegEx检查包含特殊序列的给定长度的字符串

我正在寻找一个匹配具有给定长度(参数化)的字符串,以“+”或小写字母开头的正则表达式。 它还必须包含至少一个大写字母,后面跟一个数字,而且不能以数字结尾。 在两者之间可以有小写和大写字母以及数字[a-zA-Z0-9] 。 该字符串可能是较大字符串的一部分。

实施长度限制时遇到困难。 试图用前瞻来解决它,但它不会工作。 假设字符串的长度为10:

(?!.{10,})[a-z+][a-zA-Z0-9]*([A-Z][0-9])+[a-zA-Z0-9]*[a-zA-Z]

10:

这些示例字符串应该匹配:

c4R9vMh0Lh

+ lKj9CnR5x

这些示例字符串不应匹配:

9kR7alcjaa

+ 5kl9Rk9XZ

aBikJ6clo9

长度4:

这些示例字符串应该匹配:

aR3v

+ K7Z

这些示例字符串不应匹配:

9R3v

+ 7KZ

aK79

你能给我一些提示吗?


有点奇怪的要求,但这似乎是做你想做的事情:

/[a-z+]
 (?=([A-Za-z0-9]{8}[A-Za-z]))
 (?=.{0,6}[A-Z][0-9])
 1
/x

以正常方式匹配第一个字符后,它使用前视来检查长度和基本一致性要求(所有字母和数字,不以数字结尾)。 在#1组中捕获与前瞻相匹配的任何内容。

然后,从第一个字符后面的位置再次开始,另一个前瞻检查更具体的条件:大写字母后跟数字。 如果成功,则反向引用( 1 )继续并消耗在第一个预见中捕获的字符。

参数化正则表达式很简单,可以根据所需长度用数字或表达式替换大括号内的数字。 以下是Java中的一个示例:

import java.util.regex.*;

public class Test
{
  public static void main(String[] args) throws Exception
  {
    String[] inputs = {
      "c4R9vMh0Lh",
      "+lKj9CnR5x",
      "9kR7alcjaa",
      "+5kl9Rk9XZ",
      "aBikJ6clo9",
      "aR3v",
      "+K7Z",
      "9R3v",
      "+7KZ",
      "aK79"
    };

    int len = Integer.parseInt(args[0]);
    String regex = "[a-z+]" +
      "(?=([A-Za-z0-9]{" + (len-2)  + "}[A-Za-z]))" +
      "(?=.{0," + (len-4) + "}[A-Z][0-9])" +
      "1";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher("");
    System.out.println("length = " + len);
    System.out.println("regex = " + p.pattern());
    for (String s : inputs)
    {
      System.out.printf("%n%12s : %b%n", s, m.reset(s).find());
    }
  }
}

样本输出:

>java Test 4
length = 4
regex = [a-z+](?=([A-Za-z0-9]{2}[A-Za-z]))(?=.{0,0}[A-Z][0-9])1

  c4R9vMh0Lh : false

  +lKj9CnR5x : true

  9kR7alcjaa : true

  +5kl9Rk9XZ : false

  aBikJ6clo9 : true

        aR3v : true

        +K7Z : true

        9R3v : false

        +7KZ : false

        aK79 : false

您的示例使用否定向前而不是正面,请使用^(?=.{10,}) 。 只要您的正则表达式支持向前看,这应该工作。

在我看来,像这样的情况通常最好使用1个以上的正则表达式,但这并不总是一种选择。


这个:

#!/usr/bin/perl

$_ = "Hello%20world%20how%20are%20you%20today";
print "<$1>" while m{
    G ( (?: [^%] | % p{xdigit}{2} )+ )
    (?:
        (?<= G .{5} )
       |(?<= G .{4} )
       |(?<= G .{3} )
    )
}xg;

产生这个:

<Hello>
<%20wo>
<rld>
<%20ho>
<w%20a>
<re%20>
<you>
<%20to>
<day>

而这个:

$_ = <<EOM;
This particularly rapid,
unintelligible patter,
Isn't generally heard,
and if it is it doesn't matter.
EOM

s/(s)/sprintf("%%%02X", ord $1)/ge;
print "$_nn";

产生这一点:

This%20particularly%20rapid,%20%0Aunintelligible%20patter,%20%0AIsn't%20generally%20heard,%20%0Aand%20if%20it%20is%20it%20doesn't%20matter.%0A

<This>
<%20pa>
<rticu>
<larly>
<%20ra>
<pid,>
<%20>
<%0Aun>
<intel>
<ligib>
<le%20>
<patte>
<r,%20>
<%0AIs>
<n't>
<%20ge>
<neral>
<ly%20>
<heard>
<,%20>
<%0Aan>
<d%20i>
<f%20i>
<t%20i>
<s%20i>
<t%20d>
<oesn'>
<t%20m>
<atter>
<.%0A>
链接地址: http://www.djcxy.com/p/74819.html

上一篇: RegEx to check for string with given length containing special sequence

下一篇: Get which capture group matched a result using Delphi's TRegex