Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在非转义分隔符上正确拆分?_Java_Regex_Escaping_Delimiter - Fatal编程技术网

Java 如何在非转义分隔符上正确拆分?

Java 如何在非转义分隔符上正确拆分?,java,regex,escaping,delimiter,Java,Regex,Escaping,Delimiter,我有以下示例字符串: A|B\|C\\|D\\\|E\\\\F 以|作为分隔符,\作为转义字符。 适当的分割应如下所示: A B\|C\\ D\\\|E\\\\ F 此外,我需要这种逻辑在分隔符或转义由多个字符组成的情况下普遍适用 我已经有了一个在正确位置拆分的正则表达式,但它不会生成所需的输出: 正则表达式: (?<!\Q\\E)(?:(\Q\\\E)*)\Q|\E 我通常在这里测试:,但我使用java,所以我有更多的功能 还尝试了以下操作,但也没有得到积极的结果(在网页上不起作用

我有以下示例字符串:

A|B\|C\\|D\\\|E\\\\F
以|作为分隔符,\作为转义字符。 适当的分割应如下所示:

A
B\|C\\
D\\\|E\\\\
F
此外,我需要这种逻辑在分隔符或转义由多个字符组成的情况下普遍适用

我已经有了一个在正确位置拆分的正则表达式,但它不会生成所需的输出:

正则表达式:

(?<!\Q\\E)(?:(\Q\\\E)*)\Q|\E
我通常在这里测试:,但我使用java,所以我有更多的功能

还尝试了以下操作,但也没有得到积极的结果(在网页上不起作用,但在java中无法产生所需的结果):


(?=(\Q\\\E){0,5})(?提取方法

您可以使用匹配方法,因为它是最稳定的,并且允许任意数量的转义字符

(?s)(?:\\.\[^\\\\\\]+
详情如下:

  • (?s)
    -
    模式.DOTALL
    嵌入式标志选项
  • (?:\\.[^\\\\\\]+
    -一个或多个重复的
    \
    ,然后是任何一个字符,或除了
    \
    之外的任何字符
见:

String s=“A | B \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
Pattern Pattern=Pattern.compile((?:\\\.\[^\\\\\\\\\\\\\])+”,Pattern.DOTALL);
匹配器匹配器=模式匹配器;
列表结果=新建ArrayList();
while(matcher.find()){
results.add(matcher.group());
} 
系统输出打印项次(结果);
//=>[A,B\\'C\\,D\\\\'E\\\,F]
拆分方法(拆分<代码>的解决方法

您可以(ab)在Java正则表达式中使用受限宽度查找模式支持,并使用限制量词,如
{01000}
而不是
*
量词

String s=“A | B \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;

String[]results=s.split((?你的意思是你的输入是
A | B\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\不要使用
split
,它不会像提取方法那样稳定。虽然这回答了问题的标题,但我的问题可能问得有点不正确。我特别需要一个正则表达式,可以放在split函数中,并且可以使用多个字符作为分隔符和转义符。@FelixUnverzagt我建议使用解决方案而非变通方法。非常感谢第二种方法正在发挥作用(遗憾的是,我需要这样的逻辑,因为它是更大的正则表达式逻辑的一部分)。如果我有时间考虑如何在将来替换其他部分,我将尝试采用第一种方法
A
B\|C
D\\\|E
F
(?=(\Q\\\E){0,5})(?<!\Q\\E)\Q|\E