假设我有字符串:
String toTokenize = "prop1=value1;prop2=String test='1234';int i=4;;prop3=value3";
我想要代币:
为了向后兼容,我必须使用分号作为分隔符。我试过用CDATA包装代码:
String toTokenize = "prop1=value1;prop2=<![CDATA[String test='1234';int i=4;]]>;prop3=value3";
但我无法找出一个正则表达式来忽略cdata标签内的分号。
我已尝试转义非分隔符:
String toTokenize = "prop1=value1;prop2=String test='1234'\\;int i=4\\;;prop3=value3";
然而,删除转义字符有一个丑陋的混乱。
你有什么建议吗?
答案 0 :(得分:1)
您可以匹配<![CDATA...]]>
或;
以外的任何字符,1次或多次,以匹配值。要匹配密钥,您可以使用常规\w+
模式:
(\w+)=((?:<!\[CDATA\[.*?]]>|[^;])+)
请参阅regex demo。
<强>详情
(\w+)
- 第1组:一个或多个单词字符=
- =
标志((?:<!\[CDATA\[.*?]]>|[^;])+)
- 第1组:一个或多个序列
<!\[CDATA\[.*?]]>
- <![CDATA[...]]>
子字符串|
- 或[^;]
- 任何字符;
查看Java demo:
String rx = "(\\w+)=((?:<!\\[CDATA\\[.*?]]>|[^;])+)";
String s = "prop1=value1;prop2=<![CDATA[String test='1234';int i=4;]]>;prop3=value3";
Pattern pattern = Pattern.compile(rx);
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
System.out.println(matcher.group(1) + " => " + matcher.group(2));
}
结果:
prop1 => value1
prop2 => <![CDATA[String test='1234';int i=4;]]>
prop3 => value3
答案 1 :(得分:0)
先决条件:
所有令牌都以prop
除了令牌的开头之外,文件中没有prop
我只是按;prop
~prop
然后你的字符串变为:
"prop1=value1~prop2=String test='1234';int i=4~prop3=value3";
然后,您可以使用~
分隔符