Регулярное выражение для пользовательских типов

Мне интересно создать новую грамматику и построить 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 = ваниль.

Таким образом, мороженое и конус являются обязательными, сливки взбивать необязательно и нужно знать шоколад или ваниль, чтобы принять выражение

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

Другие решения

Вы можете попробовать это регулярно:

ABD?[CE]
0

По вопросам рекламы [email protected]