使用Regex处理布尔短语

时间:2011-06-29 19:03:26

标签: c# regex

我正在搜索页面上处理用户输入。如果用户选择“所有单词”类型搜索,则从搜索文本中删除任何布尔搜索运算符,并在每个真实单词之间粘贴' AND '。在大多数情况下非常简单。但是,我无法弄清楚如何连续删除两个布尔运算符。

这是我的代码:

// create the regex
private static Regex _cleaner =
     new Regex("(\\s+(and|or|not|near)\\s+)|\"", 
          RegexOptions.Compiled | RegexOptions.IgnoreCase);

// call the regex
_cleaner.Replace(searchText, " ")

当用户输入coffee and not tea之类的搜索字符串时,会出现此问题。正则表达式将删除'和',但不删除'不'。结果串是“咖啡因茶” - 我想要的是'咖啡茶'。

正则表达式中需要空格,所以当嵌入真实单词(如'band'或'corps')时,我不会删除'和','或'等。

我通过两次调用clean方法暂时解决了这个问题,这将连续删除两个运算符(这可能就是我所需要的)。但它不是很优雅,是吗?我真的很想做对。我觉得我错过了一些简单的事情......

4 个答案:

答案 0 :(得分:3)

尝试添加字边界:

"\\b(and|or|not|near)\\b|\""

答案 1 :(得分:1)

将正则表达式更改为以下内容:

private static Regex _cleaner = new Regex("(\\s+(and|or|not|near)\\s+)*|\"", RegexOptions.Compiled | RegexOptions.IgnoreCase);

答案 2 :(得分:0)

不只是添加+来解决问题吗?

private static Regex _cleaner = 
    new Regex("(\\s+(and|or|not|near)\\s+)+|\"", 
              RegexOptions.Compiled | RegexOptions.IgnoreCase);

// call the regex
_cleaner.Replace(searchText, " ")

答案 3 :(得分:0)

您的正则表达式不匹配,因为您在术语的每一侧都需要空格,但由于它不是_and__not_,因此您只匹配_and_

考虑这个正则表达式:

@"(?:and|or|not|near)\s+|"""