正则表达式在括号和关键字之间获取文本

时间:2014-04-04 14:58:52

标签: regex text keyword parentheses

我有这样的文字图案;

(((a) or (b) or (c)) and ((d) or (e)) and ((!f) or (!g)))

我希望得到这样的结果;

((a) or (b) or (c))
((d) or (e))
((!f) or (!g))

之后我想像这样分开他们;

a,b,c
d,e
!f,!g

任何帮助都会很棒:)

编辑1:抱歉丢失的部分;使用语言是C#,这就是我得到的;

(\([^\(\)]+\))|([^\(\)]+)

我得到了;

(a) or (b) or (c) and (d) or (e) and (!f) or (!g)

非常感谢!

2 个答案:

答案 0 :(得分:1)

采用this previous regex并稍微修改代码......

string msg= "(((a) or (b) or (c)) and ((d) or (e)) and ((!f) or (!g)))";
var charSetOccurences = new Regex(@"\(((?:[^()]|(?<o>\()|(?<-o>\)))+(?(o)(?!)))\)");
var charSetMatches = charSetOccurences.Matches(msg);
foreach (Match mainMatch in charSetMatches)
{
    var sets = charSetOccurences.Matches(mainMatch.Groups[1].Value);
    foreach (Match match in sets)
    {
        Console.WriteLine(match.Groups[0].Value);
    }
}

第一个正则表达式用于获取最外层的内容。

然后使用相同的正则表达式来获取“更大”内容中的各个集合。你得到这个作为输出:

((a) or (b) or (c))
((d) or (e))
((!f) or (!g))

ideone demo

如果要删除外部的parens,只需更改最里面的行:

Console.WriteLine(match.Groups[0].Value);

Console.WriteLine(match.Groups[1].Value);

获得:

(a) or (b) or (c)
(d) or (e)
(!f) or (!g)

我相信你可以从这里拿走它。

答案 1 :(得分:0)

在我工作之后我想到了这一点;

  string msg = "(((a) or (b) or (c)) and ((d) or (e)) and ((!f) or (!g)))";

  Regex regex = null;
  MatchCollection matchCollection = null;

  regex = new Regex(@"(\([^\(\)]+\))|([^\(\)]+)"); // For outer parantheses
  matchCollection = regex.Matches(query);
  foreach (Match match in matchCollection)
  {
    MatchCollection subMatchCollection = Regex.Matches(match.Value, @"(""[^""]+"")|([^\s\(\)]+)"); // For value of inner parantheses
    foreach (Match subMatch in subMatchCollection)
    {
      //with 2 loops i got each elements of this type of string.
    }
  }

感谢大家! :)