Regex получить текст между скобками и ключевыми словами

У меня есть текстовый образец как это;

(((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 ответа

Решение

Взяв это предыдущее регулярное выражение и немного изменив код...

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 демо

Если вы хотите удалить внешние символы, просто измените внутреннюю строку:

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

в

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

Получить:

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

Я надеюсь, что вы можете взять это отсюда.

После моей работы я понимаю это;

  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.
    }
  }

Спасибо всем!:)

Другие вопросы по тегам