自定义类型的正则表达式

时间:2015-09-07 07:04:27

标签: c++ objective-c regex grammar regular-language

我有兴趣创建一个新的语法并为语法构建REGEX。 语法是一套允许词汇与否的法律。

例如,我创建了5种类型:A,B,C,D,E。

我的语法就像ABC,ABE,ABDC,ABDE一样。 (A和B必须,D可选,需要选择C或E)。

如何创建REGEX以检查单词是否与自定义语法一致?

(c / c ++或目标C代码的偏好)

非常感谢。

<=> A =冰淇淋,B =浓缩,D =搅打奶油,C =巧克力,E =香草。

所以冰淇淋和冰淇淋是必不可少的,鞭子奶油是可选的,需要知道巧克力或香草才能接受表达

2 个答案:

答案 0 :(得分:1)

试试这个

(AB(C|E)D?)|(ABD?(C|E))

对于目标C:

NSString *searchedString = @"ice creamconewhipped creamchocolate";//NOTE: here i dont put space
NSString *A = @"ice cream";
NSString *B = @"cone";
NSString *D = @"whipped cream";
NSString *C = @"chocolate";
NSString *E = @"vanila";
NSString *stringRegExp = [NSString stringWithFormat:@"(%@%@(%@|%@)%@?)|(%@%@%@?(%@|%@))",A,B,C,E,D,A,B,D,C,E];//(AB(C|E)D?)|(ABD?(C|E))
NSPredicate *myTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", stringRegExp];
if ([myTest evaluateWithObject: searchedString])
{
    NSLog(@"MATCHING");
}
else
{
    NSLog(@"NOT_MATCHING");
}

班级的等效案例:

HomeViewController *objA = [[HomeViewController alloc]init];
 NSString *className1 = NSStringFromClass([objA class]);

TableViewController *objB = [[TableViewController alloc]init];
NSString *className2 = NSStringFromClass([objB class]);

CustomTextView *objD  = [[CustomTextView alloc]init];
NSString *className4 = NSStringFromClass([objD class]);

CustomTableViewCell *objC = [[CustomTableViewCell alloc]init];
NSString *className3 = NSStringFromClass([objC class]);


NSString *objE;

NSString *searchedStringABDC = [NSString stringWithFormat:@"%@%@%@%@",className1,className2,className3,className4];//CASE ABDC/ ABCD

NSString *A = NSStringFromClass([HomeViewController class]);
NSString *B = NSStringFromClass([TableViewController class]);
NSString *D = NSStringFromClass([CustomTextView class]);
NSString *C = NSStringFromClass([CustomTableViewCell class]);
NSString *E = NSStringFromClass([AssementAndPlanView class]);

NSString *stringRegExp = [NSString stringWithFormat:@"(%@%@(%@|%@)%@?)|(%@%@%@?(%@|%@))",A,B,C,E,D,A,B,D,C,E];//(AB(C|E)D?)|(ABD?(C|E))
NSPredicate *myTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", stringRegExp];
if ([myTest evaluateWithObject: searchedStringABDC])
{
    NSLog(@"MATCHING");
}
else
{
    NSLog(@"NOT_MATCHING");
}

如果您不需要正确的顺序,而不使用正则表达式,则可以使用isKindOfClass进行检查。例如:

if ([objA isKindOfClass:[HomeViewController class]]&&[objB isKindOfClass:[TableViewController class]]&&[objC isKindOfClass:[CustomTableViewCell class]]&&!objD&&!objE)
{
    //case ABC
    NSLog(@"case ABC");
}
else if ([objA isKindOfClass:[HomeViewController class]]&&[objB isKindOfClass:[TableViewController class]]&&[objE isKindOfClass:[AssementAndPlanView class]]&&!objC&&!objD)
{
    //case ABE
    NSLog(@"case ABE");        
}

答案 1 :(得分:0)

你可以尝试这个常规:

ABD?[CE]