簡體   English   中英

自定義類型的正則表達式

[英]Regular expression for custom types

我有興趣創建一個新的語法並為該語法構建 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 = 香草。

所以冰淇淋和蛋卷是必須的,奶油可選,需要知道巧克力或香草才能接受表達

嘗試這個

(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");
}

或者,如果您不需要正確的順序,而不使用 regex ,您可以使用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");        
}

你可以試試這個常規:

ABD?[CE]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM