字符串拆分令牌= java和正则表达式中的值

时间:2014-12-12 14:48:17

标签: java regex split

我有这个字符串

token1=value1Token2=value2Token3[12]=value3

其中tokenX可能是带数字的字符串(例如:myToken12或my2Token) 和valueX只是数字或符号(例如:123123 or {{1, 2}, 3, 4}

我想转换成这个数组:

['token1=value1', 'token2=value2', 'token3[12]=value3']

我可能拥有的字符串示例:

String s = na23me=12341234las4tName={{0,0,0},{0,0,0},{0,0,0}}stree2t[696]=764545457OK

我试过分裂和匹配......

这个问题已经发布,但这是不同的,因为它更通用(令牌=值),其中前一个问题中的值只是一个数字或不同的帖子符号。 我想在这里得到一般答案。

感谢。

更多细节:

使用此字符串:

String s = na23me=12341234las4tName=654567stree2t[696]=764545457OK

此解决方案:

String[] tokens = s.split("(?<==\\d{1,1000})(?=[a-zA-Z])");

有效,但我可能有&#34;价值&#34;像我这样{1,2,3}的东西,我想考虑一下。这就是为什么不同的原因。

一级以上 如果我想包括&#34; TEST&#34;太?

e.g:

conf=0ticket[0,9]="TEST"config={0,0,0}platform_id=121212

我已尝试过这个

String[] tokens = buffer.split("(?<==\\d{1,1000}|\\W| **\"\\w\"**)(?=[a-zA-Z])");

预期:

At the end just managing the "STRING" as "value", but it shouldn't be a big issue as is into the double quote.


['conf=0', 'ticket[0,9]="TEST"', 'config={0,0,0}', 'platform_id=121212']

不工作..idea?

1 个答案:

答案 0 :(得分:1)

看起来您的输入字符串变得越来越复杂。这是一个似乎适用于您提供的所有输入的正则表达式:

void getTokens(String s) {
   String[] toks = s.split( "(?<==(?>\"[^\"=]{1,1000}\"|\\P{L}{1,1000})) *(?=\\p{L})" );
   for (String tok: toks)
      System.out.printf("=> <%s>%n", tok);
}

<强>测试

getTokens("conf=0ticket[0,9]=\"TEST\"config={0,0,0}platform_id=121212");
=> <conf=0>
=> <ticket[0,9]="TEST">
=> <config={0,0,0}>
=> <platform_id=121212>

getTokens("na23me=12341234las4tName={{0,0,0},{0,0,0},{0,0,0}}stree2t[696]=764545457OK");
=> <na23me=12341234>
=> <las4tName={{0,0,0},{0,0,0},{0,0,0}}>
=> <stree2t[696]=764545457>
=> <OK>

getTokens("na23me=12341234las4tName=654567stree2t[696]=764545457OK");
=> <na23me=12341234>
=> <las4tName=654567>
=> <stree2t[696]=764545457>
=> <OK>

<强>解释

Regex使用lookbehind和lookahead进行拆分:

  • (?<==(?>\"[^\"=]{1,1000}\"|\\P{L}{1,1000}))是一个积极的外观,可确保当前位置前面有一个=,后跟其中一个:
    • 双引号字符串,长度最大为1000或
    • 1到1000个非unicode字母
  • (?>foo|bar)被称为Atomic Group
  • (?=\\p{L})是一个积极的先行,确保当前位置后面有一个unicode字母