【问题标题】:Split with regex is not splitting every match用正则表达式分割并不是分割每场比赛
【发布时间】:2014-11-26 13:07:14
【问题描述】:

我需要在 #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]     

我找不到我做错了什么。有人吗?

【问题讨论】:

  • 能否请您发布预期的输出?
  • 你试过regexper.com/debuggex.com或类似的regexp调试服务吗?
  • 简单一点; #([A-Z]{3}\d_?\d*)#
  • 我想你搞混了'/'字符,这是 JS 形式的将字符串签名为正则表达式。从正则表达式中删除它并重试: 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])#");

标签: java regex split string-split


【解决方案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]

DEMO

正则表达式:

#                        '#'
[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
#                        '#'

【讨论】:

    【解决方案2】:
    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])#");
    

    这对我有用。查看演示。

    http://regex101.com/r/oE6jJ1/33

    【讨论】:

      【解决方案3】:

      无需多做:

      String[] embTagsToArray = embossingTags.split("#[^#]*#");
      

      (如果为空则删除最后一项)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-17
        • 2014-11-06
        • 1970-01-01
        相关资源
        最近更新 更多