我正在寻找匹配具有给定长度(参数化)的字符串的正则表达式,该字符串以“+”或小写字母开头。它还必须包含至少一个大写字母后跟一个数字,它不能以数字结尾。在它们之间可以有小写和大写字母以及数字[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
你能给我一些提示吗?
答案 0 :(得分:2)
有点奇怪的要求,但这似乎做你想要的:
/[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
答案 1 :(得分:1)
您的示例使用负向前看而不是正向,请改用^(?=.{10,})
。只要您的正则表达式支持前瞻性,这应该可以正常工作。
在我看来,这样的情况通常最好使用超过1个正则表达式,但这并不总是一个选项。
答案 2 :(得分:0)
此:
#!/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 "$_\n\n";
产生这个:
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>