替换字符串但仅针对c#中的特定模式

时间:2017-08-02 06:12:31

标签: c# string replace

我有2个字符串,一个是主字符串,另一个是要替换的模式字符串。只有在主字符串中匹配特定模式时,我才想用模式字符串替换主字符串的某些部分。

示例:

string mainstring = "[def].[ijk] = [abc].[def].[ijk]";
string pattern =    "[lmn].[def].[ijk]";

我希望最终字符串为

  

[lmn]。[def]。[ijk] = [abc]。[def]。[ijk]

即。如果字符串中只有2个部分而不是仅替换3个部分

我正在使用:

mainstring = mainstring.Replace("[def].[ijk]",pattern);

但它取代了,

[lmn].[def].[ijk] = [abc].[lmn].[def].[ijk]
                          ^-------+-------^
                                  |
                                  +-- don't replace here

但我想要

  

[lmn]。[def]。[ijk] = [abc]。[def]。[ijk]

编辑:替换的附加规则:

您可以触摸左侧或右侧,但图案应该是单独的,之前或之后没有任何东西。

3 个答案:

答案 0 :(得分:1)

我试图遵循这条规则:

  

即。如果字符串中只有2个部分而不是仅替换3个部分

(仅当匹配模式不在其他部分之间时,将其解释为替换,或者:既不在.之前也不在其后

此正则表达式应满足上述规则:

string mainstring = "[def].[ijk] = [abc].[def].[ijk]";
// will replace only right side
//string mainstring = "[abc].[def].[ijk] = [def].[ijk]"; 

string replacement = "[lmn].[def].[ijk]";

string pattern = @"(?<!\.)\[def\].\[ijk\](?!\.)";

string output = Regex.Replace(mainstring, pattern, replacement);

修改

如果您需要将基本模式转换为正则表达式格式,请替换两个括号:

string searchPattern  = "[def].[ijk]";

searchPattern = searchPattern.Replace("[", @"\[").Replace("]", @"\]");

并将结果放在前瞻和后方模式之间:

string pattern = @"(?<!\.)" + searchPattern + @"(?!\.)";

<强>解释

(?<!\.):该模式称为负向前瞻。仅当前面的字符不是.(点)

时才会匹配

(?!\.):该模式称为负面后视。仅当以下字符不是.(点)

时才会匹配

[ ]替换为\[ \]是必要的,因为正则表达式将括号视为间隔或组,并匹配括号之间的每个字符。与[0-9]匹配09之间的任何数字一样。但是如果使用转义序列@"\[0-9\]",它将把括号作为一个字符并匹配模式"[0-9]"。我希望它变得更清晰了

答案 1 :(得分:0)

不好但是工作;

       string mainstring = "[def].[ijk] = [abc].[def].[ijk]";
       string pattern = "[lmn].[def].[ijk]";
        string search ="[def].[ijk]";
        string mainstring3 = "";
       string[] mainstring2 = mainstring.Split(' ');
       for (int i = 0; i < mainstring2.Length; i++)
       {
           if (mainstring2[i] == search)
           {
               mainstring2[i] = pattern;
           }
           if (i < mainstring2.Length - 1)
           {
               mainstring3 += mainstring2[i] + " ";
           }
           else
           {
               mainstring3 += mainstring2[i];
           }
       }
       mainstring = mainstring3;
    }

答案 2 :(得分:0)

这对你有用吗?

 string mainstring = "[def].[ijk] = [abc].[def].[ijk]";

            string leftFillWith = "[lmn].[def].[ijk]";

            string pattern = @"((\[lmn\]).)?((\[def\]).)?(\[ijk\])? =";

          var expected=  Regex.Replace(mainstring, pattern,match=> leftFillWith+" =" );

如果只接受两部分:

  string mainstring = "[def].[ijk] = [abc].[def].[ijk]";

            string leftFillWith = "[lmn].[def].[ijk]";

           // string pattern = @"((\[lmn\]).)?((\[def\]).)?(\[ijk\])? ="; //if any number of parts is accepted on left


          string  pattern = @"(\[def\]\.\[ijk\])(\s)+="; //if only two parts are accepted

            string expected = Regex.IsMatch(mainstring,pattern)? Regex.Replace(mainstring, pattern, match => leftFillWith + " ="):mainstring;