我正在尝试从rc文件中提取信息。在这些文件中,“字符串中的-chars通过将它们加倍(”“)来转义为类似于c#逐字字符串。是否可以提取字符串?
例如,如果我有以下字符串“这是”“测试”“”我想获得这是一个“”测试“”。它也必须是非贪婪的(非常重要)。
我尝试使用以下正则表达式;
"(?<text>[^""]*(""(.|""|[^"])*)*)"
然而,表现糟糕。 我基于这里的解释:http://ad.hominem.org/log/2005/05/quoted_strings.php
有人有任何想法使用正则表达式来处理这个问题吗?
答案 0 :(得分:5)
你有一些嵌套的重复量词。 That can be catastrophic for the performance.
尝试这样的事情:
(?<=")(?:[^"]|"")*(?=")
现在只能同时使用两个引号...或非引号字符。 lookbehind和lookahead断言,实际匹配之前和之后是引号。
这也让你无需捕捉任何东西。您想要的结果将只是您想要的完整字符串(没有外部引号)。
我没有断言外部报价不会加倍。因为如果是的话,无论如何也无法将它们与空字符串区分开来。
答案 1 :(得分:2)
事实证明这比你期望的要简单得多。带有转义引号的字符串文字看起来就像一堆简单的字符串文字一起运行:
"Some ""escaped"" quotes"
"Some " + "escaped" + " quotes"
所以这就是你需要匹配的全部内容:
(?:"[^"]*")+
你必须在一个单独的步骤中去除前导和尾随引号,但这不是什么大问题。无论如何,您还需要一个单独的步骤来取消转义的转义引号(\"
或""
)。
答案 2 :(得分:0)
如果这比m.buettner更好或更差(不要猜测 - 他似乎知道他的东西),不要这样做但是我想我会把它扔到那里批评。
"(([^"]+(""[^"]+"")*)*)"
答案 3 :(得分:0)
试试这个(?<=^")(.*?"{2}.*?"{2})(?="$)
它可能比之前的两个更快
没有任何错误。
答案 4 :(得分:0)
"([^"]|(""))*?"