java - 关于正则表达式中字符的恰好 n 次出现

标签 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=="

最佳答案

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

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

RegEx Demo

正则表达式分解:

  • (?:[<>=!]=|\\|\\||[+=\\{}]) :匹配我们想要拆分的运算符之一
  • (?:[^"]*"){2}找到一对引号
  • (?:(?:[^"]*"){2})*查找 0 个或多对引号
  • [^"]*$确保在上次匹配的报价之后我们不再有任何报价 所以(?=...)断言前面有偶数个引号,因此仅匹配带引号的字符串之外的符号。

关于java - 关于正则表达式中字符的恰好 n 次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48224940/

相关文章:

python - 将名字和姓氏标记为一个标记

java - 我如何比较在不同的 jvm 上运行的 2 个大对象?

java - 创建将保留默认错误 Controller 功能的错误 Controller

java - 使用java正则表达式解析json数据

java - 正则表达式带分数

javascript 正则表达式因双引号而失败

c++ - 使用具有不同参数的 Boost Tokenizer escaped_list_separator

java - java中的正则表达式

java - 从重定向 URL header 获取位置

eclipse中的java程序错误