[英]How to match pairs of characters using Regex?
我有一个包含字符串的变量。 该字符串仅包含字母和数字字符。 此字符串的长度也固定为32个字符。 我怎样才能匹配使用正则表达式,如果此字符串只由2,4,8,16长配对字符?
例如,类似于以下字符串:
abcdefghijklmnopqrstuvwxyz012345
Regex.IsMatch
必须返回false
。
但是对于类似于以下的字符串:
aaaaaaaaaaaaaaaaaa 5555555555555555
这是16个字符对;
aaaaaaaa 55555555aaaaaaaaaa55555555
这是8个字符对;
aaaa 5555aaaa5555aaaa5555aaaa5555
这是4个字符对;
aa 55aa55aa55aa55aa55aa55aa55aa55
这是2个字符对-
Regex.IsMatch
必须返回true
。
编辑
显然,要求仅是匹配例如aabbccddeeffgghhiijjkkllmmnnoopp
,即前两个字符必须相同,然后接下来的两个必须精确匹配32个字符。 可以使用以下方法轻松测试:
((\w)\2(\w)\3){8}
这应该起作用(无需为每种可能的组合提出单独的正则表达式)。
public bool isRelevantMatch(string inputString)
{
int matchCount = Regex.Matches(inputString, @"([a-zA-Z])\1{1}").Count;
return matchCount == 1 ||
matchCount == 2 ||
matchCount == 4 ||
matchCount == 8 ||
matchCount == 16;
}
说明:获取重复字符的匹配计数(使用反向引用正则表达式来匹配aa,AA,bb,BB等的任何实例)。 如果该计数是1、2、4 或 8,则返回true(字符串中有2、4、8或16个成对字符)。
迟到了,但是会丢掉这个。
如果您想重复“ 唯一对 ”,则在Perl中有效。
我试图将其缩小,但不知道怎么做。
点网的语法可能是相同的。 但是,我已经重用了
捕获组名称,该名称在Perl中有效,但不确定Dot-Net
(如果没有更改为唯一名称,应该可以)。
此外,在Perl中,本可以使用分支重置来覆盖捕获组,
然后测试单个组的长度以获取重复顺序,但这在点网中不可用。
因此,只需测试4个组的匹配(或长度)即可获得订单。
# (?<A>(?<b>\w)\k<b>(?!\k<b>)(?<c>\w)\k<c>)\k<A>{7}|(?<A>(?<b>\w)\k<b>{3}(?!\k<b>)(?<c>\w)\k<c>{3})\k<A>{3}|(?<A>(?<b>\w)\k<b>{7}(?!\k<b>)(?<c>\w)\k<c>{7})\k<A>{1}|(?<A>(?<b>\w)\k<b>{15}(?!\k<b>)(?<c>\w)\k<c>{15})
(?<A> # (1 start), 2 char pairs, repeating x 8
(?<b> \w ) # (2)
\k<b>
(?! \k<b> )
(?<c> \w ) # (3)
\k<c>
) # (1 end)
\k<A>{7}
|
(?<A> # (4 start), 4 char pairs, repeating x 4
(?<b> \w ) # (5)
\k<b>{3}
(?! \k<b> )
(?<c> \w ) # (6)
\k<c>{3}
) # (4 end)
\k<A>{3}
|
(?<A> # (7 start), 8 char pairs, repeating x 2
(?<b> \w ) # (8)
\k<b>{7}
(?! \k<b> )
(?<c> \w ) # (9)
\k<c>{7}
) # (7 end)
\k<A>{1}
|
(?<A> # (10 start), 16 char pairs
(?<b> \w ) # (11)
\k<b>{15}
(?! \k<b> )
(?<c> \w ) # (12)
\k<c>{15}
) # (10 end)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.