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

时间:2015-04-16 20:18:49

标签: c# regex vb.net string

我正在尝试将字符串中的键 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)

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

P.S。不是必需的,但如果有一些方法可以使正则表达式不区分大小写(例如“input_csv”'input_CSV',或 INPut_CSV < / strong>全部被替换),那也很棒。谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

这是我的尝试:

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

(?i)启用不区分大小写的搜索,然后我们将可选单引号或双引号捕获到捕获组中,匹配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解析器重新发明轮子时才使用它。