C# 正则表达式来替换可以引用也可以不引用的字符串

C# 正则表达式来替换可以引用也可以不引用的字符串,c#,regex,vb.net,string,C#,Regex,Vb.net,String,我试图用一个文件路径替换字符串中的key INPUT_CSV的所有实例,该文件路径保证不会包含任何单引号或双引号或其他不安全的字符。但是,此文件路径将被双引号包围 在输入字符串中,键可能被双引号、单引号或完全没有引号包围。我希望尽可能灵活,用相同的双引号文件路径替换所有这些实例 我现在就是这样做的: Dim doubleQuotedCsvFilePath As String = """" & generatedCsvFilePath & """" scriptStr = scr

我试图用一个文件路径替换字符串中的key 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.不是一个要求,但是如果有某种方法使regex案例也变为instive,以便例如input_csv、'input_csv'或input_csv都被替换,那也很好。谢谢

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

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

请参见

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

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

以下是我的尝试:

(?i)(['""]?)input_csv\1
?我打开不区分大小写的搜索,然后我们将可选的单引号或双引号捕获到捕获组中,匹配输入\u 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:

输出:

"INPUT_CSV"
免责声明:仅当您没有使用CSV解析器重新发明控制盘时才使用它。

以下是我的尝试:

(?i)(['""]?)input_csv\1
?我打开不区分大小写的搜索,然后我们将可选的单引号或双引号捕获到捕获组中,匹配输入\u 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:

输出:

"INPUT_CSV"

免责声明:只有在您没有使用CSV解析器重新发明轮子的情况下才能使用它。

您是使用CSV解析器还是自己滚动?考虑到前者,你会在路上节省很多头痛。至于字符串过滤,你可以将ToupPad添加到字符串替换中,然后你知道CASE不会是一个问题,也就是假设你不希望替换为CASE敏感。$1INPUT_CSV$2就行了?@paqogomez不,我根本不打算解析CSV的内容。你是在使用一个或是你自己的?考虑到前者,你会在路上节省很多头痛。至于字符串过滤,你可以将ToupPad添加到字符串替换中,然后你知道CASE不会是一个问题,也就是假设你不希望替换为CASE敏感。$1INPUT_CSV$2可以吗?@paqogomez不,我根本不打算解析CSV的内容。scriptStr不是正则表达式对象。我知道OP可以选择任何已接受的答案,但此解决方案无法解决帖子中提到的区分大小写问题。scriptStr不是正则表达式对象。我知道OP可以选择任何已接受的答案,但是这个解决方案并没有解决文章中提到的区分大小写的问题。当字符串被单引号或双引号包围时,这个解决方案非常有效,但是它不适用于无引号的情况。看起来这可能只是正则表达式的一个小改进,对吗?另外,我认为替换的参数是颠倒的,仅供参考。我通过添加?在[']旁边。此外,此答案还显示了如何强制执行不区分大小写的搜索并替换为内联?i选项。我添加了C代码。好的,很酷。我接受了你的回答,因为你也提到了案件不敏感的问题。我不需要C代码,但可能对其他人有用。谢谢谢谢你的提问!当字符串被单引号或双引号包围时,这种方法非常有效,但在无引号的情况下不起作用。看起来这可能只是正则表达式的一个小改进,对吗?另外,我认为替换的参数是颠倒的,仅供参考。我通过添加?在[']旁边。此外,此答案还显示了如何强制执行不区分大小写的搜索并替换为内联?i选项。我添加了C代码。好的,很酷。我接受了你的回答,因为你也提到了案件不敏感的问题。我不需要C代码,但可能对其他人有用。谢谢谢谢你的提问!