查找用不同类型的双引号括起来的字符串

时间:2021-02-08 15:32:13

标签: c# .net regex .net-core

我正在编写一个正则表达式来提取用不同类型的双引号(")括起来的字符串。

到目前为止,我已经编写了下面的代码,它按预期工作,但正则表达式非常大,我认为可以改进。

//mergeField = {{field(“dd/MMM/yyyy")}}
var startIndex = mergeField.IndexOf('(');
var endIndex = mergeField.IndexOf(')');
string format = mergeField.Substring(startIndex: startIndex + 1, length: endIndex - startIndex - 1);

string formatSpecifierPattern = string.Format(@"{0}|{1}|{2}|{3}|{4}|{5}", @"(\“.*?\”)|(\”.*?\”)", "\\\"(.*?)\\\"", "“(.*?)\\\"", "\\\"(.*?)“", "”(.*?)\\\"", "\\\"(.*?)”");
MatchCollection matches = Regex.Matches(format, formatSpecifierPattern);

在上面的代码中,mergeField 作为参数传递,它可以有不同的引号组合。有什么方法可以简化我的正则表达式并处理所有组合 (", , )

输入 - 预期输出

{{field(“dd/MMM/yyyy")}} -> “dd/MMM/yyyy"
{{field("dd/MMM/yyyy“)}} -> "dd/MMM/yyyy“
{{field("dd/MMM/yyyy")}} -> "dd/MMM/yyyy"
{{field(“dd/MMM/yyyy“)}} -> “dd/MMM/yyyy“
{{field(“dd/MMM/yyyy“)}} -> “dd/MMM/yyyy“
{{field(”dd/MMM/yyyy")}} -> ”dd/MMM/yyyy"
{{field("dd/MMM/yyyy”)}} -> "dd/MMM/yyyy”
{{field(”dd/MMM/yyyy”)}} -> ”dd/MMM/yyyy”

1 个答案:

答案 0 :(得分:3)

如果您只关心 <one kind of quote> <some text> <one kind of quote> 而引用的类型无关紧要,那么您需要做的就是:

["“”](.*?)["“”]

Try it online

说明:

  • ["“”]:这些字符之一
  • (.*?):尽可能多的任何字符,但lazy match
  • ["“”]:这些字符之一

如果 <some text> 具有您知道的格式,您还可以指定该格式以防止捕获其他用引号括起来的文本(如果可能的话)

例如: ["“”]\d{1,2}/\w{3}/\d{4}["“”] 将匹配 "08/Feb/2021",但不匹配 "dd/MMM/yyyy""abcdefgh" Try it online