正则表达式替换可能会或可能不会被引用的字符串

Posted

技术标签:

【中文标题】正则表达式替换可能会或可能不会被引用的字符串【英文标题】:Regex to replace a string that may or may not be quoted 【发布时间】:2015-06-23 11:27:31 【问题描述】:

我正在尝试用一个文件路径替换字符串中键 INPUT_CSV 的所有实例,该文件路径保证其中没有任何单引号或双引号(或路径的其他不安全字符) .但是,这个文件路径会被双引号括起来。

输入字符串中的键可以用双引号、单引号或根本没有引号括起来。我希望尽可能灵活,并用相同的双引号文件路径替换所有这些实例。

这就是我目前的做法:

Dim doubleQuotedCsvFilePath As String = """" & generatedCsvFilePath & """"

scriptStr = scriptStr.Replace("""INPUT_CSV""", doubleQuotedCsvFilePath)
scriptStr = scriptStr.Replace("'INPUT_CSV'", doubleQuotedCsvFilePath)
scriptStr = scriptStr.Replace("INPUT_CSV", doubleQuotedCsvFilePath)

是否有某种漂亮的正则表达式(或者可能是其他方法)可以更简洁地做到这一点?如果这是最好的方法,我也很好 - 只是想知道是否有更好的方法。谢谢!

附:不是要求,但如果有某种方法也可以使正则表达式不区分大小写(例如 "input_csv"'input_CSV'INPut_CSV 全部被替换),那也很棒。谢谢!

【问题讨论】:

您是使用csv parser 还是滚动您自己的?考虑一下前者,以后你会省去很多麻烦。 至于字符串过滤,您可以将 .ToUpper() 添加到字符串替换中,然后您知道大小写不会成为问题,即假设您不希望替换区分大小写. scriptStr = New Regex("(?i)(['""])input_csv(['""])").Replace(doubleQuotedCsvFilePath, "$1INPUT_CSV$2") 可以吗? @paqogomez 不,我根本不会解析 CSV 的内容。 【参考方案1】:

这是我的尝试:

(?i)(['""]?)input_csv\1

(?i) 打开不区分大小写的搜索,然后我们将 optional 单引号或双引号捕获到捕获组中,匹配 input_csv 字符串然后检查是否有相同的结束引号作为开场白。

VB.NET:

Dim doubleQuotedCsvFilePath As String = """" & "InPuT_CsV" & """"
Dim scriptStr As String
Dim m As Regex = New Regex("(?i)(['""]?)input_csv\1")
scriptStr = m.Replace(doubleQuotedCsvFilePath, "$1INPUT_CSV$1")

C#:

var doubleQuotedCsvFilePath = "\"InPuT_CsV\"";
var scriptStr = string.Empty;
var m = new Regex(@"(?i)(['""]?)input_csv\1");
scriptStr = m.Replace(doubleQuotedCsvFilePath, "$1INPUT_CSV$1");

输出:

"INPUT_CSV"

免责声明:仅当您不使用 CSV 解析器重新发明***时才使用它。

【讨论】:

这适用于字符串被单引号或双引号包围的情况,但不适用于无引号的情况。看起来这可能只是对正则表达式的一个小改进,对吧?另外,我认为 Replace 的论点是相反的(仅供参考)。 我通过在['""] 旁边添加? 使引用成为可选。此外,此答案显示了如何强制执行不区分大小写的搜索并用内联 (?i) 选项替换。我添加了 C# 代码。 好的,很酷。我继续并接受了您的回答,因为您还解决了不区分大小写的问题。我不需要 C# 代码,但也许这对其他人有用。谢谢! 谢谢你的好问题!【参考方案2】:

您可以使用反向引用来匹配第一个引号:

  string scriptStr= "'INPUT_CSV'";
  string pattern = @"(""|'?)INPUT_CSV\1";
  Regex rgx = new Regex(pattern);
  scriptStr = rgx.Replace(scriptStr, doubleQuotedCsvFilePath);

见https://msdn.microsoft.com/en-us/library/thwdfzxy%28v=vs.110%29.aspx

【讨论】:

scriptStr 不是 Regex 对象。 我了解 OP 可以选择任何答案作为接受,但此解决方案并未解决帖子中提到的区分大小写问题。

以上是关于正则表达式替换可能会或可能不会被引用的字符串的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 正则表达式

正则表达式基础原理及优化

正则表达式查找函数的所有引用并将参数替换/添加到所有实例

正则表达式说明

正则表达式:匹配指定字符后面的字符怎样实现?

正则表达式