关于正则表达式中正好出现n个字符

时间:2018-01-12 11:04:09

标签: java regex tokenize

我试图用+ = ==< => =!= ||来破坏令牌中的字符串{}当它们出现在双引号之外时。但它是单次出现|的标记化< > !这不是必需的。那怎么处理呢?

String line1= "sa2dvf=s||a|df&&v<gdsf==ds!gv!=fdgv\"fvdsvg=kjhbhbj==\"";
String regex = "[\\{\\}+={!=}{<=}{>=}{||}](?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)";
String[] tokens = line1.split(regex, -1);
for(String val : tokens) {
    System.out.println(val);
}

它的输出是:

sa2dvf
s

a
df&&v
gdsf

ds
gv

fdgv"fvdsvg=kjhbhbj=="

但要求是:

sa2dvf
s
a|df&&v<gdsf
ds!gv
fdgv"fvdsvg=kjhbhbj=="

1 个答案:

答案 0 :(得分:2)

您可以使用此前瞻性正则表达式进行拆分:

String[] arr = str.split("(?:[<>=!]=|\\|\\||[+=\\{}])(?=(?:(?:[^\"]*\"){2})*[^\"]*$)");

RegEx Demo

RegEx分手:

  • (?:[<>=!]=|\\|\\||[+=\\{}]):匹配我们要拆分的其中一个运营商
  • (?:[^"]*"){2}找到一对引号
  • (?:(?:[^"]*"){2})*找到0对或更多引号
  • [^"]*$确保在最后匹配的报价后我们没有其他报价 所以(?=...)断言我们前面有多个引号,因此仅匹配引用字符串之外的符号。