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;