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

时间:2015-06-09 22:06:59

标签: c# regex

我有一个包含字符串的变量。该字符串仅包含字母和数字字符。该字符串的长度也是 32 个字符的固定长度。如果此字符串只有 2 4 8 16 的长度配对字符,我可以使用正则表达式进行匹配EM>

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

  

abcdefghijklmnopqrstuvwxyz012345

Regex.IsMatch必须返回false

但对于与此类似的字符串:

  

aaaaaaaaaaaaaaaa 5555555555555555

这是 16 - 字符对;

  

AAAAAAAA 55555555aaaaaaaa55555555

这是 8 - 字符对;

  

AAAA 5555aaaa5555aaaa5555aaaa5555

这是 4 - 字符对;

  

AA 55aa55aa55aa55aa55aa55aa55aa55

这是 2 - 字符对 -

Regex.IsMatch必须返回true

3 个答案:

答案 0 :(得分:1)

修改

显然,要求只是匹配例如aabbccddeeffgghhiijjkkllmmnnoopp,即前两个字符必须相同,然后是接下来的两个字符,正好是32个字符。这可以通过以下方式轻松测试:

((\w)\2(\w)\3){8}

答案 1 :(得分:0)

这应该有用(无需为每种可能的组合提出单独的正则表达式)。

var cd1=CD(artist: "Pink Floyd", title: "The Wall", tracks: 13, sequence: "1st")
var cd2=CD(artist: "Sting", title: "Dream of the Blue Turtles", tracks: 12, sequence: "1st")
var cd3=CD(artist: "Pink Floyd", title: "Wish you were here", tracks: 10, sequence: "2nd")

var allCDs:[CD]=[cd1,cd2,cd3]

var latestDictionary=Dictionary<String,CD>()

for cd in allCDs {

    if let compareCD=latestDictionary[cd.artist] {
        if let cdSequence="".join(cd.sequence.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)).toInt() {
            if let compareSequence="".join(compareCD.sequence.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)).toInt() {

                if (cdSequence > compareSequence) {
                    latestDictionary[cd.artist]=cd
                }
            }
        }

    } else {
        latestDictionary[cd.artist]=cd
    }

}
var latestCDs=latestDictionary.values.array

说明:获取重复字符的匹配计数(使用反向引用正则表达式匹配aa,AA,bb,BB等的任何实例)。如果该计数为1,2,4, 8,则返回true(字符串中有2个,4个,8个或16个成对字符)。

答案 2 :(得分:0)

迟到但会抛出这个。

如果您想重复&#39; 唯一配对&#39;这适用于Perl 我试图让它变小,但无法弄清楚如何。

Dot-Net的语法可能是相同的。但是,我重复使用了 捕获组名,在Perl中工作,但不确定Dot-Net
(如果没有更改为唯一名称,应该没问题)。

此外,在Perl中,可以使用分支重置来覆盖捕获组,
然后测试单个组长度以获得重复顺序,但这在Dot-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)