在Java中,如何标记包含标记中分隔符的字符串?

时间:2018-02-19 13:40:19

标签: java regex tokenize

假设我有字符串:

String toTokenize = "prop1=value1;prop2=String test='1234';int i=4;;prop3=value3";

我想要代币:

  1. PROP1 =值1
  2. prop2 = String test ='1234'; int i = 4;
  3. prop3 =值3
  4. 为了向后兼容,我必须使用分号作为分隔符。我试过用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";
    

    然而,删除转义字符有一个丑陋的混乱。

    你有什么建议吗?

2 个答案:

答案 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";

然后,您可以使用~分隔符

进行标记