using System;
using System.Collections .Generic ;
using System.Linq ;
using System.Text .RegularExpressions ;
namespace Rextester
{
public class Program
{
public static void Main( string[ ] args)
{
Regex r = new Regex(
@"^([01A-Z](?![01A-Z])|
(?<dyadic>[|&>=]\((?!,))|
(?<comma-dyadic>,(?!\)))|
(?<dBracket-comma>\))|
(?<monadic>~\((?!\)))|
(?<uBracket-monadic>\)))+
(?(dyadic)(?!))(?(comma)(?!))(?(monadic)(?!))$"
, RegexOptions.IgnorePatternWhitespace ) ;
string target = @"&(A,|(B,C)" ;
string[ ] passList = {
@"&(A,B)" ,
@"~(0)" ,
@"&(A,~(B))" ,
@">(~(=(D,A)),~(B))" ,
@"=(A,&(C,D))" ,
@"T" } ;
for ( int i = 0 ; i< passList.Length ; i++ ) {
if ( r.Match ( passList[ i] ) .Success )
{
Console.WriteLine ( "String: " + passList[ i] + " Matches." ) ;
}
else {
Console.WriteLine ( "Match expected for" + passList[ i] + " but failed" ) ;
}
}
string[ ] failList = {
@"&(A,B" ,
@"~(A,B)" ,
@"&(A,|(B))" ,
@">(~(=(D,A),~(B))" ,
@">" ,
@">(,)" ,
@"|(,A)" ,
@"|(A,)" ,
@"~()" ,
@"DF" ,
@"~(DS)" ,
@"=(AD,BC)"
} ;
for ( int i = 0 ; i< failList.Length ; i++ ) {
if ( r.Match ( failList[ i] ) .Success )
{
Console.WriteLine ( "String: " + failList[ i] + " matches but should not." ) ;
}
else {
Console.WriteLine ( "No match as expected" ) ;
}
}
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKCm5hbWVzcGFjZSBSZXh0ZXN0ZXIKewogICAgcHVibGljIGNsYXNzIFByb2dyYW0KICAgIHsKICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQogICAgICAgIHsKICAgICAgICAgICAgUmVnZXggciA9IG5ldyBSZWdleCgKICAgICAgICAgICAgICAgIEAiXihbMDFBLVpdKD8hWzAxQS1aXSl8CiAgICAgICAgICAgICAgICAoPzxkeWFkaWM+W3wmPj1dXCgoPyEsKSl8CiAgICAgICAgICAgICAgICAoPzxjb21tYS1keWFkaWM+LCg/IVwpKSl8CiAgICAgICAgICAgICAgICAoPzxkQnJhY2tldC1jb21tYT5cKSl8CiAgICAgICAgICAgICAgICAoPzxtb25hZGljPn5cKCg/IVwpKSl8CiAgICAgICAgICAgICAgICAoPzx1QnJhY2tldC1tb25hZGljPlwpKSkrCiAgICAgICAgICAgICAgICAoPyhkeWFkaWMpKD8hKSkoPyhjb21tYSkoPyEpKSg/KG1vbmFkaWMpKD8hKSkkIgogICAgICAgICAgICAgICAgLCBSZWdleE9wdGlvbnMuSWdub3JlUGF0dGVybldoaXRlc3BhY2UpOwogICAgICAgICAgICBzdHJpbmcgdGFyZ2V0ID0gQCImKEEsfChCLEMpIjsKICAgICAgICAgICAgc3RyaW5nW10gcGFzc0xpc3QgPSB7CiAgICAgICAgICAgICAgICBAIiYoQSxCKSIsCiAgICAgICAgICAgICAgICBAIn4oMCkiLAogICAgICAgICAgICAgICAgQCImKEEsfihCKSkiLAogICAgICAgICAgICAgICAgQCI+KH4oPShELEEpKSx+KEIpKSIsCiAgICAgICAgICAgICAgICBAIj0oQSwmKEMsRCkpIiwKICAgICAgICAgICAgICAgIEAiVCJ9OwogICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpPHBhc3NMaXN0Lkxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgICAgIGlmIChyLk1hdGNoKHBhc3NMaXN0W2ldKS5TdWNjZXNzKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdHJpbmc6ICIgKyBwYXNzTGlzdFtpXSArICIgTWF0Y2hlcy4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIk1hdGNoIGV4cGVjdGVkIGZvciIrIHBhc3NMaXN0W2ldICsgIiBidXQgZmFpbGVkIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHN0cmluZ1tdIGZhaWxMaXN0ID0gewogICAgICAgICAgICAgICAgQCImKEEsQiIsCiAgICAgICAgICAgICAgICBAIn4oQSxCKSIsCiAgICAgICAgICAgICAgICBAIiYoQSx8KEIpKSIsCiAgICAgICAgICAgICAgICBAIj4ofig9KEQsQSksfihCKSkiLAogICAgICAgICAgICAgICAgQCI+IiwKCQlAIj4oLCkiLAogICAgICAgICAgICAJQCJ8KCxBKSIsCiAgICAgICAgICAgIAlAInwoQSwpIiwKICAgICAgICAgICAgCUAifigpIiwKICAgICAgICAgICAgCUAiREYiLAogICAgICAgICAgICAJQCJ+KERTKSIsCiAgICAgICAgICAgIAlAIj0oQUQsQkMpIgogICAgICAgICAgICB9OwogICAgICAgICAgICAKICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaTxmYWlsTGlzdC5MZW5ndGg7IGkrKyl7CiAgICAgICAgICAgICAgICBpZiAoci5NYXRjaChmYWlsTGlzdFtpXSkuU3VjY2VzcykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU3RyaW5nOiAiICsgZmFpbExpc3RbaV0gKyAiIG1hdGNoZXMgYnV0IHNob3VsZCBub3QuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJObyBtYXRjaCBhcyBleHBlY3RlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9