我有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]
编辑:替换的附加规则:
您可以触摸左侧或右侧,但图案应该是单独的,之前或之后没有任何东西。
答案 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]
匹配0
和9
之间的任何数字一样。但是如果使用转义序列@"\[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;