我需要在#ABC3#,#ABC3_3#或#ABC3_33#标签的每个匹配上拆分一个字符串,然后我构建了以下正则表达式:
/#([A-Z][A-Z][A-Z])([0-9])#|#([A-Z][A-Z][A-Z])([0-9])_([0-9])#|#([A-Z][A-Z][A-Z])([0-9])_([0-9][0-9])#/
我想分割以下字符串:
1234 5647 8512 5648#EMB2#12#EMB3#DEC 12#EMB4#33/03#EMB7_12#02/12#EMB7_13#1999#EMB5#22/19#EMB6#DEC 22#EMB7_1#DEC 22#EMB7_2#14#EMB7_3#11/22#EMB7_14#11/22#EMB7_15#2013#EMB7_4#ASDCFG ASDFWED ODLSKEMT #EMB7_5#423253 AB ASDCFGER ASDFGH#EMB7_6#4444#EMB7_8#222#EMB7_9##EMB7_16#
问题是以下代码没有拆分字符串的每个匹配项。
String[] embTagsToArray = embossingTags.split("/#([A-Z][A-Z][A-Z])([0-9])#|#([A-Z][A-Z][A-Z])([0-9])_([0-9])#|#([A-Z][A-Z][A-Z])([0-9])_([0-9][0-9])#/");
最终的数组应该有18个位置,但它被分成9个阵列位置,如下所示:
[0] 1234 5647 8512 5648#EMB2#12#EMB3#DEC 12#EMB4#33/03#EMB7_12#02/12#EMB7_13#1999#EMB5#22/19#EMB6#DEC 22
[1] DEC 22
[2] 14
[3] 11/22#EMB7_14#11/22#EMB7_15#2013
[4] ASDCFG ASDFWED ODLSKEMT
[5] 423253 AB ASDCFGER ASDFGH
[6] 4444
[7] 222
[8] #EMB7_16#
预期产出:
[0] 1234 5647 8512 5648
[1] 12
[2] DEC 12
[3] 33/03
[4] 02/12
[5] 1999
[6] 22/19
[7] DEC 22
[8] DEC 22
[9] 14
[10] 11/22
[11] 11/22
[12] 2013
[13] ASDCFG ASDFWED ODLSKEMT
[14] 423253 AB ASDCFGER ASDFGH
[15] 4444
[16] 222
[17]
我找不到我做错了什么。任何人吗?
答案 0 :(得分:1)
根据以下使用非捕获组的正则表达式来拆分输入字符串。
String s = "1234 5647 8512 5648#EMB2#12#EMB3#DEC 12#EMB4#33/03#EMB7_12#02/12#EMB7_13#1999#EMB5#22/19#EMB6#DEC 22#EMB7_1#DEC 22#EMB7_2#14#EMB7_3#11/22#EMB7_14#11/22#EMB7_15#2013#EMB7_4#ASDCFG ASDFWED ODLSKEMT #EMB7_5#423253 AB ASDCFGER ASDFGH#EMB7_6#4444#EMB7_8#222#EMB7_9##EMB7_16#";
String[] tok = s.split("#[A-Z]{3}\\d(?:_\\d{1,2})?#");
System.out.println(Arrays.toString(tok));
<强>输出:强>
[1234 5647 8512 5648, 12, DEC 12, 33/03, 02/12, 1999, 22/19, DEC 22, DEC 22, 14, 11/22, 11/22, 2013, ASDCFG ASDFWED ODLSKEMT , 423253 AB ASDCFGER ASDFGH, 4444, 222]
正则表达式:
# '#'
[A-Z]{3} any character of: 'A' to 'Z' (3 times)
\d digits (0-9)
(?: group, but do not capture (optional):
_ '_'
\d{1,2} digits (0-9) (between 1 and 2 times)
)? end of grouping
# '#'
答案 1 :(得分:1)
String[] embTagsToArray = embossingTags.split("#([A-Z][A-Z][A-Z])([0-9])#|#([A-Z][A-Z][A-Z])([0-9])_([0-9])#|#([A-Z][A-Z][A-Z])([0-9])_([0-9][0-9])#");
这对我有用。参见演示。
答案 2 :(得分:0)
无需做更多:
String[] embTagsToArray = embossingTags.split("#[^#]*#");
(删除最后一项,如果它为空)