我输入字符串如下
("abc xyz" OR "def") AND (ghi OR jkl) AND ("mno poe" OR stu)
我希望用
替换它 (myfun("abc xyz") OR myfun("def")) AND (myfun(ghi) OR myfun(jkl)) AND (myfun("mno poe") OR myfun(stu))
我想要用双引号或单个词替换myfun(<string matched>)
任何身体都可以帮助我,我怎样才能使用正则表达式设置它? 谢谢 Meghana
答案 0 :(得分:4)
以下C#引用的表达式匹配引用的字符串和不是AND
或OR
的字词:
@"(""(?:[^\\""]+|\\.)*""|\b(?!(?:AND|OR)\b)\w+\b)"
将其替换为:
"myfun($1)"
如果所有大写单词都是运算符,则可以改为使用此表达式:
@"(""(?:[^\\""]+|\\.)*""|\b(?![A-Z]+\b)\w+\b)"
更新以满足OP的新要求,表达式如下:
@"(?i)(""(?:[^\\""]+|\\.)*""|\b(?!(?:and|or|not|near)\b)\w+\b)"
添加(?i)
以使其不区分大小写并完成运算符令牌列表。
答案 1 :(得分:2)
替换
(".+?"|\b\w+?\b)(?<!(OR|AND))
带
myfun($1)
答案 2 :(得分:1)
[Test]
public void Test2()
{
string input = "(\"abc xyz\" OR \"def\") AND (ghi OR jkl) AND (\"mno poe\" OR stu)";
string expected = "(myfun(\"abc xyz\") OR myfun(\"def\")) AND (myfun(ghi) OR myfun(jkl)) AND (myfun(\"mno poe\") OR myfun(stu))";
string actual = Regex.Replace(input, @"([\""\']).*?(\1)|\b(?!AND|OR)\w+\b", ReplaceWord);
Assert.AreEqual(expected, actual);
}
private static string ReplaceWord(Match m)
{
return string.Format("myfun({0})", m.Value);
}
答案 3 :(得分:1)
List<string> reservedWords = new List<string>() { "AND","OR","NEAR","NOT" };
var rep = Regex.Replace(
inputString,
@"([\""][\w ]+[\""])|(\w+)",
m=> reservedWords.Contains(m.Value) ? m.Value : "myfun(" + m.Value + ")"
);