2012-02-12 18 views
2

這是一個簡單的正則表達式,我試過使用一些在線測試工具,它可以工作,但是當我在代碼中運行它時,它不會。Cocoa中這個簡單的正則表達式有什麼問題

BEGIN EDIT:它根本找不到任何匹配。我想要做的是檢查配置文件中的某行是否包含http設置。所以如果一行是extraintf=我想將其更改爲extraintf=http,如果行是extraintf=rc:ncurses,我想將其更改爲extraintf=rc:ncurses:http,並且如果行是#extraintf=我想將其更改爲extraintf=http。我使用一個正則表達式來查找該行的位置和長度,一旦我有了行的開始和長度,我寫了一些測試和工作代碼,它們將執行上述的罰款,它只是找到匹配的範圍,即問題。 編輯完

這裏是我的正則表達式:

^#?extraintf=.*$ 

我想找到它在所有這些文件的中間線:

文件1:

# Interface module (string) 
#intf= 

# Extra interface modules (string) 
extraintf=         //match this line 

# Control interfaces (string) 
#control= 

文件2:

# Interface module (string) 
#intf= 

# Extra interface modules (string) 
extraintf=rc         //match this line 

# Control interfaces (string) 
#control= 

文件3:

# Interface module (string) 
#intf= 

# Extra interface modules (string) 
#extraintf=         //match this line 

# Control interfaces (string) 
#control= 

然後我檢查匹配的方法是使用:

//check if file exists 
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:fullPath isDirectory:&isDirectory]; 

if (isDirectory || !fileExists) { 
    return; 
} 

//get the settings file 
NSError *error; 
NSString *settingsString = [NSString stringWithContentsOfFile:fullPath encoding:NSMacOSRomanStringEncoding error:&error]; 


NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^#?extraintf=.*$" options:NSRegularExpressionCaseInsensitive error:NULL]; 

NSRange rangeOfFirstMatch = [regex rangeOfFirstMatchInString:settingsString options:0 range:NSMakeRange(0, [settingsString length])]; 

if (!NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0))) { 
    //got a match 
} 
else { 
    //no match 
} 
+2

是這樣的:'regularExpressionWithPattern:@「^ extraintf = $」'在您粘貼的代碼中是否正確?它缺少'#'和'。*'...此外,你能解釋什麼不起作用嗎?沒有比賽呢?只是在其中一個案件? – sergio 2012-02-12 18:08:54

+0

對不起,我複製了我正在測試的代碼貼,現在修復。它根本找不到任何匹配。 – lms 2012-02-12 18:11:38

回答

4

您需要將NSRegularExpressionAnchorsMatchLines添加到選項。這將允許^$匹配行的開始和結束。

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^#?extraintf=.*$" 
           options:NSRegularExpressionCaseInsensitive|NSRegularExpressionAnchorsMatchLines 
           error:NULL]; 
+0

我有同樣的問題,並嘗試你的方法,但它不工作..雖然在我的情況下,正則表達式字符串是不同的。 其 NSRegularExpression * regex = [NSRegularExpression regularExpressionWithPattern:@「[a-z0-9!#$%&'* +/=?^ _'{|}〜 - ] +(?:\。[a-z0 !???-9#$%&'* +/=^_'{|}〜 - ] +)* @(:[A-Z0-9](:[A-Z0-9 - ] * [一-z0-9])\)+(?:?[AZ] {2} | COM |組織|網絡| EDU | GOV |萬|企業|資訊|牧高笛|名稱|航空|亞洲|人才招聘|博物館)」選項:NSRegularExpressionCaseInsensitive | NSRegularExpressionAnchorsMatchLines error:&error]; – 2012-04-23 10:06:23

0

你試過鬆動的比賽也是這樣嗎?

"^[^e]?extraintf=.*$" 
+0

嘗試了'^ \#?extraintf =。* $'這給了我一個「無效的轉義序列」警告,並且嘗試了'^ \\#?extraintf =。* $'這不會給出警告但不起作用。 – lms 2012-02-12 18:23:26

+0

你是對的雙重逃跑!你能試試我的第二個建議嗎?除此之外,一切對我來說似乎都是正確的。你確定'settingsString'被正確初始化了嗎? – sergio 2012-02-12 18:34:32

相關問題