Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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
使用regex lookahead进行Java拆分-字符后不跟字符_Java_Regex_String - Fatal编程技术网

使用regex lookahead进行Java拆分-字符后不跟字符

使用regex lookahead进行Java拆分-字符后不跟字符,java,regex,string,Java,Regex,String,我需要将字符串拆分为子字符串,以便将它们排序为带引号的和不带引号的。单引号字符用作分隔符,两个单引号表示转义序列,表示它们不应用于拆分 例如: "111 '222''22' 3333" 应拆分为 "111", "222''22", "3333" 不管有没有空格 因此,我编写了以下代码,但它不起作用。尝试使用“\\”(?在单个撇号上拆分时使用“环视”撇号的两侧: String[] parts = str.split(" *(?<!')'(?!') *"); String[]parts=

我需要将字符串拆分为子字符串,以便将它们排序为带引号的和不带引号的。单引号字符用作分隔符,两个单引号表示转义序列,表示它们不应用于拆分

例如:

"111 '222''22' 3333"
应拆分为

"111", "222''22", "3333"
不管有没有空格


因此,我编写了以下代码,但它不起作用。尝试使用
“\\”(?在单个撇号上拆分时使用“环视”撇号的两侧:

String[] parts = str.split(" *(?<!')'(?!') *");

String[]parts=str.split(“*”(?这应该在一个单引号上拆分(当它不是双引号时),如果是三个连续的引号,它会将前两个引号分组,并在第三个引号上拆分

String [] splitted=text.split("(?<!') *' *(?!')|(?<='') *' *");

String[]splitted=text.split(“(?当您得到一个零长度字段时,只需使用split和combine。三个单引号怎么样?四个?试试这个:
”(?不需要在正则表达式中转义一个单引号。@Tomalak在3'的情况下,前两个应分组在一起,最后一个应用作分隔符,在存在两个连续单引号且OP不希望出现这种情况时,也会将其拆分。@bbik啊。我以为这是一个引号
在您的示例中,不是两个撇号
'
。请立即尝试。仍然错误,但请关闭:输入regex:*(《为什么不
“11”“222”“2”“33》)
?如果您允许使用无限撇号,则正则表达式无法执行此操作。您需要正确的语言分析器。@bbik事实上,上面的答案对于任意数量的连续撇号都不起作用,如中所示。正则表达式不解析,而是匹配。具体来说,正则表达式不处理嵌套或任意转义深度等。谢谢!看起来像是w工作!将进一步测试)您能告诉我为什么更改第一个版本吗?此版本:
(?只考虑引号,不考虑空格。你可以这样使用它,并在后面修剪空格。或者你也可以使用上面的版本,删除分隔符单引号之前/之后的任何空格。在这里,我们了解了为什么使用正则表达式进行解析是一个坏主意的核心。对于解析器来说,提出的问题微不足道。使用正则表达式的范围从“异常困难”到“不可能”,这取决于使用的是哪种正则表达式方言。一个具有可变长度外观的表达式有帮助,但Java不支持它们。当您有两个单引号并搜索一个单引号时,您有两个可能的匹配项。当您说“单引号后面不能跟单引号”,第一个匹配项将无效,因为第一个单引号后面跟单引号。但是,从技术上讲,第二个单引号后面没有单引号(序列中没有第三个单引号),因此它是匹配的。每个报价都是独立于其他报价进行审查的。因此,既不应遵循,也不应遵循另一个报价。
String[] parts = str.split(" *(?<!')'(?!') *");
String [] splitted=text.split("(?<!') *' *(?!')|(?<='') *' *");