我正在编写一个正则表达式来提取用不同类型的双引号("
、“
、”
)括起来的字符串。
到目前为止,我已经编写了下面的代码,它按预期工作,但正则表达式非常大,我认为可以改进。
//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”
答案 0 :(得分:3)
如果您只关心 <one kind of quote> <some text> <one kind of quote>
而引用的类型无关紧要,那么您需要做的就是:
["“”](.*?)["“”]
说明:
["“”]
:这些字符之一(.*?)
:尽可能多的任何字符,但lazy match["“”]
:这些字符之一如果 <some text>
具有您知道的格式,您还可以指定该格式以防止捕获其他用引号括起来的文本(如果可能的话)
例如:
["“”]\d{1,2}/\w{3}/\d{4}["“”]
将匹配 "08/Feb/2021"
,但不匹配 "dd/MMM/yyyy"
或 "abcdefgh"
Try it online