所以引用字符串的正则表达式已经反复解决 . 这里看到一个很好的答案:https://stackoverflow.com/a/5696141/692331
$re_dq = '/"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"/s';
似乎是PHP的标准解决方案 .
My Issue 是我的报价被另一个报价转义 . 例:
="123 4556 789 ""Product B v.24"""
="00 00 F0 FF ""Licence key for blah blah"" hfd.34"
=""
以前的字符串应分别与以下字符串匹配:
string '123 4556 789 ""Product B v.24""' (length=31)
string '00 00 F0 FF ""Licence key for blah blah"" hfd.34' (length=48)
string '' (length=0)
给出的示例只是字符串可能看起来像的插图,而不是我将匹配的实际字符串,其数量可以达到数万 .
我需要一个与双引号字符串匹配的正则表达式模式,该字符串可能或不包含两个双引号的序列 .
UPDATE 5/5/14:
2 回答
Edit: 根据您的要求,使用少量mod来计算空引号 .
原始解决方案
演示:
输出:
我发现了zx81的模式
每个匹配的字符后都会导致回溯 . 我发现我可以调整我问题最顶端的模式以满足我的需要 .
变
's'模式修饰符不是必需的,因为模式不使用\ s元字符 .
我必须匹配的最长字符串是28,000个字符,这导致Apache在堆栈溢出时崩溃 . 我不得不增加堆栈大小32MB(linux default is 8mb, windows is 1mb)勉强度日!我不想让每个线程有这样大的堆栈大小,所以我开始寻找更好的解决方案 .
实施例(对Regex101测试):这需要6637个步骤,使用$ re_dq_answer匹配的字符串(长度= 3200)现在要求使用$ re_dq_modified 141个步骤 . 我会说稍微改进一下!