我有这个字符串
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?
答案 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}))
是一个积极的外观,可确保当前位置前面有一个=
,后跟其中一个:
(?>foo|bar)
被称为Atomic Group (?=\\p{L})
是一个积极的先行,确保当前位置后面有一个unicode字母