Php 正则表达式在用逗号分隔的引号内解析

Php 正则表达式在用逗号分隔的引号内解析,php,regex,Php,Regex,我有一个格式如下的文件: "A","B","C - "G"","D,F",5 这就是我想要的比赛: |A|B|C - "G"|D,F|5| 我需要在引号内获取内容,这是我正在使用的表达式:(?:“([^,]*)”。但当引号中有逗号时,问题就出现了。是否可以使用正则表达式实现这一点,或者我只需将原始字符串更改为如下内容: "A"@"B"@"C - "G""@"D,F" 将匹配以下内容: "A", "B", "C - "D"", "E,F", "G,H,I", 5, 6, 2135231 由

我有一个格式如下的文件:

"A","B","C - "G"","D,F",5
这就是我想要的比赛:

|A|B|C - "G"|D,F|5|
我需要在引号内获取内容,这是我正在使用的表达式:
(?:“([^,]*)”
。但当引号中有逗号时,问题就出现了。是否可以使用正则表达式实现这一点,或者我只需将原始字符串更改为如下内容:

"A"@"B"@"C - "G""@"D,F"
将匹配以下内容:

"A", "B", "C - "D"", "E,F", "G,H,I", 5, 6, 2135231
由于您更改了要求,我已更新了答案

查看以下内容:

(?|"((?:(?!",).)*)"|\h*([^,"]+))

PHP代码:

$str = <<<_
"A", "B", "C - "G"", "D, F", 5
_;
preg_match_all('~(?|"((?:(?!",).)*)"|\h*([^,"]+))~', $str, $matches);
echo "|" . implode("|", array_filter($matches[1], 'trim')) . "|";

$str=最好在双引号内加双引号转义:
“A”、“B”、“C-”“G\”、“D,F”
您首先是如何生成文件/字符串的?您提到您可以更改分隔符,这是否意味着您正在通过加入数组打印行?我不会生成字符串(从文件中读取),但我可以这样做:
str\u replace(“\”,\”,“@”)
您可能要将
^\h*“\h*$”,“
替换为
。现场演示@revo是的,这比str_替换要好。谢谢就这样!Thanks@John这在
“A”、“B”、“C-“G”、“D、F”、“F、Z、K”上失败了
呃,我想我必须在拆分字符上使用replace,然后使用字符串子字符串。。。很遗憾没有一个regrex解决方案。这个怎么样?“([^,]*|”([^,“]*,?)*)”修复了与revo的示例相适应的答案我刚检查过,分隔符总是
没有空格。您正在不断更改您的要求。我知道,我很抱歉,我正在浏览大量我没有或将要生成的文件,这些文件非常混乱…在
1,“a”,5,a,“D”,8上失败“
,因此我将其修改为适用于此
(?|)”(((?:(?!”,)*)”([^,]*)
。谢谢!我假设引号中有一个数字或字符串。否则,您可能会面临许多误报和意外输出,因为规则不是规则。
$str = <<<_
"A", "B", "C - "G"", "D, F", 5
_;
preg_match_all('~(?|"((?:(?!",).)*)"|\h*([^,"]+))~', $str, $matches);
echo "|" . implode("|", array_filter($matches[1], 'trim')) . "|";