尝试匹配Java中几乎重复的模式

时间:2019-01-25 16:04:48

标签: java regex

我正在尝试为我的uni项目匹配一个非常特定的模式。不幸的是我被卡住了。模式如下:

  
      
  • 长度为1或2的单词或数字,后跟,
  •   
  • 重复四次,然后用;代替,
  •   
  • 整件事重复了四遍,但最后没有;
  •   

示例为:

SR,SR,SR,AR;0,11,22,33;SG,1,23,DG;SY,BY,CY,DY
36,AR,CR,DR;SB,10,16,22;SG,13,BG,DG;SY,0,20,BY

这些不匹配(查找逗号和分号):

SR,SR;SR,AR;0,11,22,33;SG,1,23,DG;SY,BY,CY,DY
36,AR,CR,DR,SB,10,16,22;SG,13,BG,DG;SY,0,20,BY

我最近的是

((([ABCDS][RBGY])|\d{1,2})[,;]){16}

但这确实与上面的否定示例匹配。

这是我当前的解决方法:

public boolean matching(String arguments) {
    String[] strings = arguments.split(";");
    if (strings.length != 4) return false;
    for (String s : strings) {
        String[] strings1 = s.split(",");
        if (strings1.length != 4) return false;
        for (String s1 : strings1) {
            if (!s1.matches(POSITION_PATTERN)) return false;
        }
    }
    return true;
}

但是,这不是理想的解决方案,而且效率很低。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用以下模式:

(?:[ABCDS][RBGY]|\d{1,2})(?:,(?:[ABCDS][RBGY]|\d{1,2})){3}(?:;(?:[ABCDS][RBGY]|\d{1,2})(?:,(?:[ABCDS][RBGY]|\d{1,2})){3}){3}

说明:

(?:[ABCDS][RBGY]|\d{1,2})          match two letter or 1-2 digits
(?:,(?:[ABCDS][RBGY]|\d{1,2})){3}  followed by a comma and another two letters or
                                   1-2 digits, that quantity 3 times
(?:;                               then match semicolon
    (?:[ABCDS][RBGY]|\d{1,2})(?:,(?:[ABCDS][RBGY]|\d{1,2})){3}){3}
                                   followed by the previous pattern 3 more times

Demo

答案 1 :(得分:0)

您对模式的描述与您的样本数据不匹配。我怀疑您是说字母组要重复四次,对吗?

一个简单的例子可能是这样的:((\w{1,2}(,|(?:\w))){4}(;|$)){4}

它只是一步一步地满足您的要求。
参见DEMO