【问题标题】:Regex to find and escape double-quotes wrapped in double-quotes正则表达式查找和转义双引号中的双引号
【发布时间】:2013-10-01 12:00:00
【问题描述】:

假设我想转义所有嵌套在双引号内的双引号(图片是 CSV 或其他东西):

"Jim", "Smythe", "Favorite Quote: "This is my favorite quote.""

我想隔离This is my favorite quote. 周围的内部引号,然后用\ 转义它们。但是我在编写一个正则表达式来匹配内部引号时遇到了麻烦。所以,我想要的结果是:

"Jim", "Smythe", "Favorite Quote: "This is my favorite quote.""
                                  ^^                        ^^
                 Start Match Here ||                        || End Match Here
                Start Capture Here |       End Capture Here |

Match:   "This is my favorite quote."
Capture:  This is my favorite quote.

然后我可以轻松地使用模式\"$1\" 转义引号以获得最终结果:

"Jim", "Smythe", "Favorite Quote: \"This is my favorite quote.\""

【问题讨论】:

  • 通常你应该在把它放到行中之前转义这个值。如果您事后这样做,您只能处理可以确定它是报价而不是值结尾的情况。例如,如果引号是逗号,则无法将其与值分隔符区分开来。
  • 我的第一个猜测是,由于这个问题中指定的原因,这是不可能的 - stackoverflow.com/questions/133601/…
  • 类似这样的东西:/"(?:[^\\"]|\\.)*"/?
  • @Jerry 我没有得到任何合理的尝试,不确定是否可以完成(至少不可靠)。
  • 除非外部字符串有一些可定义的格式(如 CSV)不能出现在内部字符串中(转义逗号不能出现在内部字符串中吗?),这是不可能的,因为你无法区分""

标签: c# regex


【解决方案1】:

我建议:

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

替换为\\$0

regex101 demo

【讨论】:

  • 顺便用前面有@的那些,这样就不用用太多的转义了,即@"(?&lt;!^|, )"(?=(?:(?&lt;!"),|[^,])*"(?:,|$))"@"\\$0"
  • 事实上我测试了这个,在Jim 匹配后,failed" 有点像。我用RegexBuddy 测试过。
  • @KingKing,我用 Expresso(基于 C# 正则表达式引擎)对其进行了测试,它适用于我给出的示例。
  • @JoshM。您应该注意到风味,看起来regex101 demo 是针对PHP flavor,而它不适用于.NET flavor。请参阅此屏幕截图sites.google.com/site/thecabinet3/home/files-store/…
  • @KingKing 第一次引用之后的空间是从哪里来的?
【解决方案2】:

这对我有用:

string input = "\"Jim\" , \"Smythe\", \"Favorite Quote: \"This is my favorite quote.\"\"";
var output = Regex.Match(input,"\"(?!\\s*,\\s*\")((?<!(,|^)\\s*\"\\w*?)[^\"]+)\"").Groups[1].Value;
//output = This is my favorite quote.

var replacedOutput = Regex.Replace(input, "\"(?!\\s*,\\s*\")((?<!(,|^)\\s*\"\\w*?)[^\"]+)\"", "\\\"$1\\\"");

【讨论】:

    猜你喜欢
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多