正则表达式,用于使用 c# 修复 solr 查询中的“and”和“or”

本文关键字:or and 查询 solr 用于 修复 正则表达式 | 更新日期: 2023-09-27 18:36:32

我们需要处理用户通过 c# dot net web 应用程序输入的 AND 和 OR 来解决"q="查询。 它还必须正确处理引用的短语(这是困难的部分......)。

大规则:必须删除"Or",除非它在带引号的字符串中。"and"必须全部大写,除非它在带引号的字符串中。

当然,问题在于匹配 OR 的正则表达式也匹配"OR",我们需要一个匹配 OR 但不匹配"OR"的正则表达式。

给定输入:A 或 B, c "或" d,"e 或 f"

输出必须为:A B, c "OR" d,"e OR f"

给定输入:A 和 B,c "and" d,"e 和 f"

输出必须为:A 和 B,C "和"d,"E 和 F"

正则表达式,用于使用 c# 修复 solr 查询中的“and”和“or”

解决方案:匹配OR和"OR"(或AND和"AND")(说快5倍),并使用自定义替换委托来确定我们是否要替换,是这样,是什么。

public string Fixup(string input)
{
//matches any quoted string containing the words OR or AND: "a and b" matches, 
//"andor" does not. 
string pattern1=@"""'w*?'W*?'b(AND|OR)'W*?'w*?"""; 
string pattern2=@"'b(AND|OR)'b"; //matches AND or OR as standalone words
string pattern3=pattern1+"|"+pattern2;//matches either pattern
MatchEvaluator Eval=ReplaceMatch;//set the delegate
string output=Regex.Replace(input,pattern3,Eval,RegexOptions.IgnoreCase);
return output;
}
public string ReplaceMatch(Match m)
{
string str=m.Value;
if(str.Contains("'""))return str;//do nothing if it's a quoted string
if(str.ToLower().Contains("or")) return String.Empty;//strip out 'or' from the query
return str.ToUpper();// string is 'and', uppercase it.
}

假设 " 无法在带引号的字符串中进行转义,您也可以在 MatchEvaluator 中使用组,如下所示:

// Check for "[^"]*" first to filter out any quoted strings
// Assign any matches of AND to the "AND" group
// Assign any matches of OR to the "OR" group
const string pattern = @"(""[^""]*"")|'s+((?<AND>AND)|(?<OR>OR))'s+";
public static string FixUp(string s)
{
    return Regex.Replace(s, pattern, ReplaceANDsAndORs, RegexOptions.IgnoreCase);
}
public static string ReplaceANDsAndORs(Match m)
{
    if (m.Groups["AND"].Length > 0)
    {
        return " AND ";
    }
    else if (m.Groups["OR"].Length > 0)
    {
        return " ";
    }
    else
    {
        return m.Value;
    }
}

更新:"AND"匹配项的处理正在删除它们周围的空格(即"a和b"被更新为"aANDb")。 此问题已得到纠正。