关于正则表达式中恰好出现 n 个字符
Regarding exactly n occurrence of character in regex
我试图用 + = == <= >= != || 打破标记中的字符串{ } 当它们出现在双引号之外时。但它是用一次出现的 | 标记化的。 < > !那不是必需的。那么如何处理呢?
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})*[^\"]*$)");
正则表达式分解:
(?:[<>=!]=|\|\||[+=\{}])
:匹配我们要拆分的运算符之一
(?:[^"]*"){2}
找到一对引号
(?:(?:[^"]*"){2})*
找到 0 或更多对引号
[^"]*$
确保我们在最后一个匹配的报价后没有更多的报价
因此 (?=...)
断言前面有偶数个引号,因此仅匹配引号字符串之外的符号。
我试图用 + = == <= >= != || 打破标记中的字符串{ } 当它们出现在双引号之外时。但它是用一次出现的 | 标记化的。 < > !那不是必需的。那么如何处理呢?
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})*[^\"]*$)");
正则表达式分解:
(?:[<>=!]=|\|\||[+=\{}])
:匹配我们要拆分的运算符之一(?:[^"]*"){2}
找到一对引号(?:(?:[^"]*"){2})*
找到 0 或更多对引号[^"]*$
确保我们在最后一个匹配的报价后没有更多的报价 因此(?=...)
断言前面有偶数个引号,因此仅匹配引号字符串之外的符号。