正規表現は、物事をより複雑にする可能性があります。これが機能するソリューションです。コメントと文字列のソリューションもあります。
static void Main(string[] args)
{
string test = ".white> TD { color: white;box-shadow: 0px 0px 3px white, inset 0px 0px 5px black; white-space:pre-wrap; background-image='white black \" white \"'}";
Console.WriteLine("Before: " + test);
test = replaceInCSS(test, "white", "green");
Console.WriteLine("After: " + test);
Console.ReadLine();
}
static string replaceInCSS(string text, string replace, string replacement)
{
char[] forceBefore = new char[]{ '\n', '\t', ';', '{', ' ', ':', ','};
char[] forceAfter = new char[] { ';', '}', ' ', ','};
int index = text.IndexOf(replace, 0);
while (index != -1)
{
if (!indexWithinStringOrComment(text, index))
{
int afterPos = index + replace.Length;
bool beforeOk = false, afterOk = false;
if (index > 0 && forceBefore.Contains<char>(text[index - 1]))
beforeOk = true;
if (afterPos < text.Length - 1 && forceAfter.Contains<char>(text[afterPos]))
afterOk = true;
if ((index == 0 || beforeOk) &&
(afterPos == text.Length - 1 || afterOk))
{
text = text.Remove(index, replace.Length);
text = text.Insert(index, replacement);
}
}
index = text.IndexOf(replace, index + 1);
}
return text;
}
static bool indexWithinStringOrComment(string text, int index)
{
bool insideStrSimple = false;
bool insideStrDouble = false;
bool insideStrComment = false;
for (int i = 0; i < index; ++i)
{
string subStr = text.Substring(i, 2);
if (text[i] == '\'' && !insideStrDouble && !insideStrComment)
insideStrSimple = !insideStrSimple;
else if (text[i] == '"' && !insideStrSimple && !insideStrComment)
insideStrDouble = !insideStrDouble;
else if (text.Substring(i, 2) == "/*" && !insideStrDouble && !insideStrSimple)
insideStrComment = true;
else if (text.Substring(i, 2) == "*/" && insideStrComment)
insideStrComment = false;
}
return insideStrDouble || insideStrSimple || insideStrComment;
}
出力:
Before: .white> TD { color: white;box-shadow: 0px 0px 3px white, inset 0px 0px 5px black; white-space:pre-wrap; background-image='white black \" white \"'}
After: .white> TD { color: green;box-shadow: 0px 0px 3px green, inset 0px 0px 5px black; white-space:pre-wrap; background-image='white black \" white \"'}
編集:さて、行きます。内側の弦の問題も解決。これは、css プロパティを置き換えるために機能するはずです。再編集: コメントの修正を追加しました。