使用逗号分割文本同时保留引号
解析逗号分隔的文本时,处理逗号出现在带引号的子字符串中的情况非常重要,比如这个例子:
123,test,444,"don't split, this",more test,1
分割这个使用默认的 String.split(",") 方法以逗号分隔字符串会产生:
123 test 444 "don't split this" more test 1
如您所见,“don't split, this”引号中的逗号被错误地解释为分隔符.
要解决这个问题,需要更复杂的方法。在这种情况下,我们可以使用正则表达式以逗号分隔字符串,而逗号后面不跟偶数个双引号。这可确保带引号的子字符串内的逗号不会被误认为分隔符。
str.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
此正则表达式使用以下逻辑:
(?=):向前看断言确保:
换句话说,此前瞻检查当前逗号后面是否有偶数个双引号以及字符串结尾(如果是的话)。 ,表示逗号不在带引号的子字符串内,可以被视为分隔符,否则,逗号将被忽略。
您也可以使用简化版本。正则表达式的:
str.split("(?x) , (?= (?: [^\"]* \" [^\"]* \" )* [^\"]* $ )");
在此版本中,修饰符 (?x) 用于通过忽略空白字符来增强正则表达式的可读性。
以上是如何在保留引号的同时拆分逗号分隔的文本?的详细内容。更多信息请关注PHP中文网其他相关文章!