用于忽略字符串中连续引号的正则表达式

本文关键字:正则表达式 连续 字符串 用于 | 更新日期: 2023-09-27 18:08:37

我已经在sprach和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

用于忽略字符串中连续引号的正则表达式

如果我理解正确的话,这就是你要找的那种正则表达式:

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

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

但归根结底还是要看你的投入是否平衡。如果没有,你就会得到假阳性。如果你有一个字符串,如"string"", which should be matched? "string" , " ',或者什么都没有?这是一个艰难的决定,幸运的是,如果你确定你的输入,你就不必做这个决定。

您可以根据这个模式调整您想要的输出:

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

的例子:http://regex101.com/r/lO1vZ4

如果你只想忽略连续的双引号,试试这个:

("{2,})

现场演示

这个正则表达式"("+)可以帮助您匹配多余的双引号。

这里是DEMO