用于忽略字符串中连续引号的正则表达式
本文关键字:正则表达式 连续 字符串 用于 | 更新日期: 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