包含和排除搜索的正则表达式模式

时间:2010-03-14 21:57:06

标签: c# regex

我正在开发一种正则表达式搜索模式,应允许在搜索中包含可选的“+”符号,并在搜索中排除“ - ”符号。例如: + apple orange -peach 应该搜索苹果和橙子而不是桃子。此外,该模式应允许双引号中的短语与单个单词混合,例如:“red apple” - “black grape”+ orange - 您可以获得与大多数互联网搜索相同的想法。 所以我正在运行2个正则表达式,首先选择所有的负数,这很简单,因为' - '是必需的:

(?<=[\-]"?)((?<=")(?<exclude>[^"]+)|(?<exclude>[^\s,\+\-"]+))

第二个选择积极因素,这有点复杂,因为'+'是可选的:

((?<=[\+\s]")(?<include>[^\s"\+\-][^"]+))|(?<include>(?<![\-\w]"?)([\w][^,\s\-\+]+))(?<!")

正面搜索是我遇到问题的地方,当我在RegexBuddy中运行它时效果很好但是当我尝试使用.Net时,模式会从负面标准中获取第二个单词,例如 - “黑葡萄”它会捡起来单词'grape'即使以双引号结尾。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

试试这个表达式:

[\+-]?(\w+|"[\w\s]+")

以+或 - 开头,可选,然后将任何单词或任何单词与引号内的空格匹配 另一条建议:尝试使用正则表达式,下载ExpressoThe Regulator等工具。

以下是使用命名组的示例,因此您可以使用正则表达式直接分隔符号和值:

static void Main(string[] args) {
    string test = "\"red apple\" -\"black grape\" +orange";
    Regex r = new Regex( "(?<sign>[\\+-]?)((?<value>\\w+)|\"(?<value>[\\w\\s]+)\")",RegexOptions.Compiled);

    foreach (Match m in r.Matches(test)) {
        Console.WriteLine(m.Groups["sign"]);
        Console.WriteLine(m.Groups["value"]);
    }
}