0

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

Da 规则:必须删除“或”,除非它在带引号的字符串中。'And' 必须全部大写,除非它在带引号的字符串中。

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

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

输出必须是:AB, c "OR" d,"e OR f"

给定输入:A 和 B,c“和”d,“e 和 f”

输出必须是:A AND B, c "and" d,"e and f"

4

2 回答 2

0

解决方案:匹配 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.
}
于 2012-06-06T16:33:12.457 回答
0

假设 " 不能在带引号的字符串中转义,您还可以在 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”)。这已得到纠正。

于 2012-06-06T17:04:47.013 回答