我正在尝试为我的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;
}
但是,这不是理想的解决方案,而且效率很低。
答案 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
答案 1 :(得分:0)
您对模式的描述与您的样本数据不匹配。我怀疑您是说字母组要重复四次,对吗?
一个简单的例子可能是这样的:((\w{1,2}(,|(?:\w))){4}(;|$)){4}
它只是一步一步地满足您的要求。
参见DEMO