5

我正在尝试从 rc 文件中提取信息。在这些文件中,字符串中的“-chars 通过将它们加倍(“”)来转义,类似于 c# 逐字字符串。有没有办法提取字符串?

例如,如果我有以下字符串"this is a ""test"""我想获得this is a ""test""。它也必须是非贪婪的(非常重要)。

我尝试使用以下正则表达式;

"(?<text>[^""]*(""(.|""|[^"])*)*)"

然而表演很糟糕。我基于这里的解释:http: //ad.hominem.org/log/2005/05/quoted_strings.php

有没有人知道使用正则表达式来解决这个问题?

4

5 回答 5

5

你有一些嵌套的重复量词。这对性能来说可能是灾难性的。

尝试这样的事情:

(?<=")(?:[^"]|"")*(?=")

现在只能同时使用两个引号......或非引号字符。lookbehind 和lookahead 断言,实际匹配在引号之前和之后。

这也让你不必捕捉任何东西。您想要的结果将只是您想要的完整字符串(没有外引号)。

我不断言外部引号没有加倍。因为如果它们是,无论如何都无法将它们与空字符串区分开来。

于 2012-11-21T14:37:03.797 回答
2

事实证明这比您预期的要简单得多。带有转义引号的字符串文字看起来就像一堆简单的字符串文字一起运行:

"Some ""escaped"" quotes"

"Some " + "escaped" + " quotes"

所以这就是你需要匹配它的全部内容:

(?:"[^"]*")+

您必须在单独的步骤中去掉前导引号和尾随引号,但这没什么大不了的。无论如何,您都需要一个单独的步骤来取消转义引号(\""")。

于 2012-11-21T15:28:35.003 回答
0
  • 匹配一个 " 开头的字符串
  • 多次匹配一个非“或两个”
  • 匹配一个 " 结尾的字符串

"([^"]|(""))*?"

于 2015-03-11T19:33:23.603 回答
0

试试这个(?<=^")(.*?"{2}.*?"{2})(?="$) ,它可能会比前两个更快,而且没有任何错误。

于 2012-11-21T15:20:00.063 回答
0

如果这比 m.buettner 的更好或更差,请不要(猜测不是 - 他似乎知道他的东西),但我想我会把它扔在那里进行批评。

"(([^"]+(""[^"]+"")*)*)"
于 2012-11-21T15:05:56.073 回答