使用正则表达式强制执行序列和分组?

时间:2011-06-22 06:43:19

标签: java regex groovy

Get groups with regex and OR

的一些延续

示例

  

AD ABCDEFG HIJKLMN
      AB HIJKLMN
      AC DJKEJKW SJKLAJL JSHELSJ

规则:总是2个字符代码(AB | AC | AD)在行开头然后是任何数字(> 1)的7个Chars代码(至少一个7char代码)。组之间的空间也可以是'。'

通过这个表达式,我得到了很好的分组 /^(AB|AC|AD)|((\S{7})+)/
我可以使用group [0]访问2chars代码,依此类推。

我可以同时执行上述规则吗?

使用上面的正则表达式,以下行也是有效的(因为正则表达式中的OR |)

  

AC
  dfghjkl
  asdfgh hjklpoi

这不是我需要的。

再次感谢正则表达式专家

2 个答案:

答案 0 :(得分:2)

试试:

^(A[BCD])(([ .])([A-Z]{7}))+$

答案 1 :(得分:1)

就个人而言,我会分两个步骤

  1. 我会检查字符串是否匹配正则表达式
  2. 我根据分隔符字符split
  3. [ .]匹配字符串

    此代码:

    def input = [
      'AD ABCDEFG HIJKLMN',
      'AB HIJKLMN',
      'AC DJKEJKW SJKLAJL JSHELSJ',
      'AC',
      'dfghjkl',
      'asdfgh hjklpoi',
      'AC DJKEJKW.SJKLAJL JSHELSJ',
    ]
    
    def regexp = /^A[BCD]([ .](\S{7}))+$/
    
    def result = input.inject( [] ) { list, inp ->
      // Does the line match the regexp?
      if( inp ==~ regexp ) {
        // If so, split it
        list << inp.split( /[ .]/ )
      }
      list
    }
    
    println result
    

    向您展示我的意思的一个例子,然后打印出来:

    [[AD, ABCDEFG, HIJKLMN], [AB, HIJKLMN], [AC, DJKEJKW, SJKLAJL, JSHELSJ], [AC, DJKEJKW, SJKLAJL, JSHELSJ]]