Java 关于正则表达式中字符的精确n次出现

Java 关于正则表达式中字符的精确n次出现,java,regex,tokenize,Java,Regex,Tokenize,我试图用+==!=||来打断令牌中的字符串{}当它们出现在双引号之外时。但它是用|!的单个出现来标记的!。这不是必需的。那么如何处理呢 String line1= "sa2dvf=s||a|df&&v<gdsf==ds!gv!=fdgv\"fvdsvg=kjhbhbj==\""; String regex = "[\\{\\}+={!=}{<=}{>=}{||}](?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"; String[] tokens

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

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您可以使用此lookahead正则表达式进行拆分:

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

正则表达式分解:

  • (?:[=!]=\\\\\\\\\\\\\\\\\\\\{}])
    :匹配我们要拆分的运算符之一
  • (?:[^“]*”{2}
    查找一对引号
  • (?:(?:[^“]*”{2})*
    查找0对或多对引号
  • [^”]*$
    确保在上次匹配的报价之后,我们没有更多的报价 因此,
    (?=…)
    断言前面有偶数个引号,因此只匹配引号字符串之外的符号

您可以使用此lookahead regex进行拆分:

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

正则表达式分解:

  • (?:[=!]=\\\\\\\\\\\\\\\\\\\\{}])
    :匹配我们要拆分的运算符之一
  • (?:[^“]*”{2}
    查找一对引号
  • (?:(?:[^“]*”{2})*
    查找0对或多对引号
  • [^”]*$
    确保在上次匹配的报价之后,我们没有更多的报价 因此,
    (?=…)
    断言前面有偶数个引号,因此只匹配引号字符串之外的符号