2017-07-25 47 views
2

喜的overflowers,NSPredicate使用正則表達式捕獲總是得到0結果

我抓我的頭周圍放置一個regular expressionNSPredicate內。

我想將我們的所有縮略圖從Documents目錄移動到Caches目錄並捕獲em'all我創建了這個正則表達式:_thumb(@[2-3]x)?\.jpg

Here on regex101.com你可以看到上面的正則表達式與這個測試數據的工作:

grwior_thumb.jpg   <- match 
grwior.jpg 
[email protected] <- match 
vuoetrjrt.jpg 
hafiruwhf_thumb.jpg  <- match 
[email protected] <- match 
[email protected] <- match 
hafiruwhf.jpg 

但是,當我把它的代碼,它不匹配任何東西:

NSError *error = nil; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 

// Find and move thumbs to the caches folder 
NSArray<NSString *> *mediaFilesArray = [fileManager contentsOfDirectoryAtPath:documentsPath error:&error]; 

NSString *regex = @"_thumb(@[2-3]x)?\\.jpg"; 
NSPredicate *thumbPredicate = [NSPredicate predicateWithFormat: @"SELF ENDSWITH %@", regex]; 

NSArray<NSString *> *thumbFileArray = [mediaFilesArray filteredArrayUsingPredicate:thumbPredicate]; 

thumbFileArray一向0元素。 ..

我在做什麼錯?

+0

加上'*'的模式,'@的開始。 「* _拇指(@ [2-3]×)?\\。JPG」 '。 –

+1

另請注意,'ENDSWITH'只是不支持「支持」正則表達式模式。請參閱下面的擴展答案。 –

回答

2

使用MATCHES而非ENDSWITH,爲ENDSWITH不把表達式作爲正則表達式,但要確保你所有的字符從字符串的開始匹配,也爲MATCHES需要一個完整的字符串匹配,所以你需要以某種方式匹配_之前的字符。

使用

NSString *regex = @".*_thumb(@[23]x)?\\.jpg"; 

然後

[NSPredicate predicateWithFormat: @"SELF MATCHES %@", regex] 

.*將匹配任何字符0+比換行字符等,儘可能多的。

請注意,如果你只是想匹配任何23,你還不如寫[23],不需要一個-範圍內運營商在這裏。

您也可以用(?:@[23]x)?替換(@[23]x)?,即將捕獲組更改爲non-capturing,因爲您似乎不需要稍後可以訪問子匹配。如果這樣做,請保留可選捕獲組。

+1

看着LIKE和MATCHES字符串比較運算符我認爲其他人是正則表達式的能力,只需要適當的逃生。你永遠不會停止學習......另外,感謝您使用非捕獲組的建議。 – Shebuka

1

問題出在ENDSWITH

ENDSWITH 
The left-hand expression ends with the right-hand expression. 
MATCHES 
The left hand expression equals the right hand expression using a regex-style comparison according to ICU v3 

你需要的是

NSString *regex = @".+_thumb(@[2-3]x)?\\.jpg"; 
NSPredicate *thumbPredicate = [NSPredicate predicateWithFormat: @"SELF MATCHES %@", regex];