1

我在 Sprache 和 C# 中为使用我无法控制的格式的文件构建了一个解析器。使用它我可以正确转换:

a = "my string";

进入

my string

解析器(仅用于引用的文本)当前如下所示:

public static readonly Parser<string> QuotedText =
    from open in Parse.Char('"').Token()
    from content in Parse.CharExcept('"').Many().Text().Token()
    from close in Parse.Char('"').Token()
    select content;

但是,我正在使用的格式使用“双双”引号转义引号,例如:

a = "a ""string"".";

尝试解析此内容时,不会返回任何内容。它应该返回:

a ""string"".

此外

a = "";

应该被解析成一个string.Empty或类似的。

我已经尝试过基于这样的答案的正则表达式不成功,例如"(?:[^;])*"或者:

public static readonly Parser<string> QuotedText =
    from content in Parse.Regex("""(?:[^;])*""").Token()

这不起作用(即在上述情况下不返回匹配项)。我认为我的初学者正则表达式技能正在妨碍我。有人有任何提示吗?

编辑:我在这里测试它 - http://regex101.com/r/eJ9aH1

4

4 回答 4

2

如果我对您的理解正确,这就是您正在寻找的那种正则表达式:

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

请参阅演示。1."匹配开头引号 2.(?:""|[^"])*匹配两个引号或任何不是引号的字符(包括换行符),重复 3."匹配结尾引号。

但这总是归结为您的输入是否平衡。如果没有,您将得到误报。如果你有一个字符串,比如"string"", which should be matched?"string"" ,""`,或者什么都没有?...这是一个艰难的决定,幸运的是,如果你确定你的输入,你就不必做这个决定。

于 2014-06-13T02:52:26.983 回答
1

您可能可以从此模式调整所需的输出:

"(.+".+")"|(".+?")|("")

例子:

http://regex101.com/r/lO1vZ4

于 2014-06-13T03:23:24.153 回答
0

此正则表达式"("+)可能会帮助您匹配多余的不需要的双引号。

这是演示

于 2014-06-13T07:00:16.463 回答
0

如果您只想忽略连续的双引号,请尝试以下操作:

("{2,})

现场演示

于 2014-06-13T02:17:58.473 回答