我有这样的文字图案;
(((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)
非常感谢!
答案 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))
如果要删除外部的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.
}
}
感谢大家! :)