如何使用正则表达式匹配字符对

本文关键字:字符 何使用 正则表达式 | 更新日期: 2023-09-27 17:55:05

我有一个包含字符串的变量。此字符串仅包含字母和数字字符。这个字符串也有一个固定长度,长度为32个字符。如果这个字符串只有24816的长度配对字符,我如何使用正则表达式进行匹配?

例如,对于类似于这个字符串:

abcdefghijklmnopqrstuvwxyz012345

Regex.IsMatch必须返回false

但是对于类似这样的字符串:

aaaaaaaaaaaaaaaa 5555555555555555

这是一个16字符对;

aaaaaaaa 55555555 aaaaaaaa55555555

这是一个8字符对;

aaaa 5555 aaaa5555aaaa5555aaaa5555

这是一个4字符对;

aa 55 aa55aa55aa55aa55aa55aa55aa55

这是一个2字符对-

Regex.IsMatch必须返回true

如何使用正则表达式匹配字符对

EDIT

显然,要求只是匹配例如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中是可行的。
我试着把它变小,但不知道怎么做。

. net的语法可能是相同的。但是,我重用了
捕获组名,这在Perl中工作,但不确定关于。net
(应该没问题,如果不更改为唯一名称)。

同样,在Perl中,可以使用分支重置来覆盖捕获组,
然后测试单个组长度以获得重复顺序,但这在。net中不可用。
所以,只需要测试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)