使用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("(?<!') *' *(?!')|(?<='') *' *");