Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 替换字符串,但仅用于c中的特定模式#_C#_String_Replace - Fatal编程技术网

C# 替换字符串,但仅用于c中的特定模式#

C# 替换字符串,但仅用于c中的特定模式#,c#,string,replace,C#,String,Replace,我有两个字符串,一个是主字符串,另一个是要替换的模式字符串。我只想在主字符串中匹配特定模式时,用模式字符串替换主字符串的某些部分 例如: string mainstring = "[def].[ijk] = [abc].[def].[ijk]"; string pattern = "[lmn].[def].[ijk]"; 我想要最后一个字符串 [lmn].[def].[ijk]=[abc].[def].[ijk] i、 e.如果串中只有2个零件,则仅更换3个零件 我正在使用: mains

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

例如:

string mainstring = "[def].[ijk] = [abc].[def].[ijk]";
string pattern =    "[lmn].[def].[ijk]";
我想要最后一个字符串

[lmn].[def].[ijk]=[abc].[def].[ijk]

i、 e.如果串中只有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]

编辑:替换的其他规则:


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

我尝试遵循以下规则:

i、 e.如果串中只有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 pattern = @"(?<!\.)" + searchPattern + @"(?!\.)";
stringpattern=@”(?不好,但工作正常

       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;
    }
string=“[def].[ijk]=[abc].[def].[ijk]”;
字符串模式=“[lmn].[def].[ijk]”;
字符串搜索=“[def].[ijk]”;
字符串3=“”;
字符串[]mainstring2=mainstring.Split(“”);
for(int i=0;i<2.Length;i++)
{
如果(主字符串2[i]==搜索)
{
主干2[i]=模式;
}
如果(i<2.长度-1)
{
主干3+=主干2[i]+';
}
其他的
{
主流3+=主流2[i];
}
}
主环=主环3;
}

这对你有用吗

 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;

我可以拆分问题是拆分字符无法修复。例如,它可以有
=
!=
和其他运算符。因此,使用特定字符串也不会有帮助。应该替换哪个部分也无法修复,例如,在示例中,您正在[0]上替换th索引,但我的模式可以在任何index@Arc那么你真的应该确切地指定规则是如何替换的。如果没有明确的规则,或者至少有几个限制,这将很难解决。下面是一些需要遵循的规则:1.分割字符不是固定的,任何字符都可以存在(如
=
!=
)2.图案位置不固定,可以是拆分字符的左侧或右侧。拆分字符仅在上面指定,可以是
+,-,*,/,,,,,(,),和,或,不是,=,
。还有所有文本函数、日期函数、转换函数、文本函数、摘要函数、逻辑函数operators@Arc哪条规则决定只替换示例中的左手边,而不替换右手边?这就是我要说的,它可以位于任何一侧,左侧或右侧:(要替换的字符串将不仅仅是
[def].[lkj]
,因此我所做的是
var rege=@“\b”+stringtosearch+“\b”;
,这将导致
\b[def].[ijk]
,而此模式不存在于原始字符串
\b[def].[ijk]\b
,如果您想捕获
[
作为一个字符,您需要使用
@“\[…
其他明智的正则表达式会将其解释为括号之间的任何字符,但我如何解决我的问题呢?括号在字符串中。我想做的是仅在
[def].[ijk]
时替换,而不是在
[abc].[def].[ijk]时替换
在整个字符串中。有什么建议吗?如果表达式单独位于右侧,这将不匹配:
“[abc].[def].[ijk]=[def].[ijk]”
你能解释一下发生了什么吗?我对你的代码片段
模式的最后两行有点困惑吗
mainstring
左侧搜索括号中的单位。你可以看到模式中有问号,所以这意味着它们是可选的:不需要,因为可能没有固定数量的问号单位位于左侧。因此,此模式将查找左侧组合,并将其替换为
leftFillWith
,方法是在末尾添加“=”号,并将其替换为“(空格)偏离航线”。@您的模式是
[lmn]
。它搜索“l”、“m”、“n”,但不搜索“lmn”。这些括号用于类范围,但不用于单位。我想你可能会感到困惑,因为括号太多了。但它作为“组合”有帮助。但我如何解决我的问题?括号在字符串中。我想做的是仅在
[def].[ijk]
时替换,而不是在整个字符串中
[abc].[def].[ijk]
时替换。有什么建议吗?
  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;