2012-01-25 51 views
1

我想創建一個正則表達式,以便當我將字符串與字符串數組進行比較時,匹配與正則表達式一起返回而忽略某些字符。是否有可能在與正則表達式匹配時忽略字符串中的字符

下面是一個例子。考慮名字的下面的數組:

{ 
    "Andy O'Brien", 
    "Bob O'Brian", 
    "Jim OBrien", 
    "Larry Oberlin" 
} 

如果用戶輸入「肥胖」,我想應用到正則表達式謂詞應用到陣列以及上述所有陣列中的名稱將匹配(例如: '被忽略)。

我知道我可以兩次運行匹配,首先針對每個名稱,然後針對每個名稱使用從字符串中去除的忽略字符。我寧願這個由一個正則表達式完成,所以我不需要兩次通過。

這可能嗎?這是針對iOS應用的,我使用的是NSPredicate。

編輯:澄清使用

從最初的答案,我意識到,我並不清楚。上面的例子是一個特定的例子。我需要一個通用的解決方案,其中名稱數組是一個具有不同名稱的大型數組,我匹配的字符串由用戶輸入。所以我不能像[o]'[b]那樣硬編碼正則表達式。

此外,我知道如何做不區分大小寫的搜索,所以不需要專注於此的答案。只需要一個解決方案來忽略我不想匹配的字符。

回答

4

既然你已經丟棄顯示這是可以做到的方式所有的答案,你留下了答案:

NO,這不能做。正則表達式沒有「忽略」字符的選項。你唯一的選擇是修改正則表達式來匹配它們,或者對你的源文本進行傳遞以擺脫你想忽略的字符,然後與之匹配。 (當然,那麼你可能會遇到將你的'清理'文本與實際源文本關聯的問題。)

+0

我發現一個合理的解決方案給予我的實現,通過源通過消除我不想匹配的字符的變化。感謝您的輸入。 – XJones

+0

這對我來說似乎過分了。爲什麼不採用搜索字符串,並指出「忽略」字符可能在每個字符後出現0或1次?例如,如果用戶輸入字符串「oleary」,則可以將其轉換爲正則表達式「o'?l'?e'?a'?r'?y'?'。我想這會對性能產生負面影響,但我不明白爲什麼它不起作用。 – octern

+0

這就是問題所在。這是一段需要儘可能快的代碼。我現在的解決方案在這方面似乎很好。謝謝。 – XJones

2

如果我理解正確,你需要一種方法來匹配字符「ob」1)而不管大小寫,2)不管它們之間是否有撇號。這應該很容易。

1)使用的情況下不敏感改性劑,或使用正則表達式,其指定信的資本和小寫版本都是可以接受的:[Oo][Bb]

2)使用?改性劑,以指示一個字符可以是呈現一次或零次。 o'?b將匹配「o'b」和「ob」。如果您想要包含可能存在或不存在的其他字符,可以用撇號對它們進行分組。例如,o['-~]?b將匹配「ob」,「o'b」,「o-b」和「o〜b」。

所以完整的答案是[Oo]'?[Bb]

更新:OP詢問一個解決方案,該解決方案將導致給定字符在任意搜索字符串中被忽略。您可以通過在搜索字符串的每個字符後插入'?來完成此操作。例如,如果您獲得搜索字符串oleary,則會將其轉換爲o'?l'?e'?a'?r'?y'?。萬無一失,但可能不是最佳的性能。請注意,如果這是一個問題,這將匹配「o'leary」,但也「o'lea'r'y」「。

+0

謝謝,請參閱我的編輯問題。我需要更通用的解決方案。 – XJones

+0

如果我正確理解更新,您希望能夠在忽略撇號的同時搜索字符串。是對的嗎?它會將搜索字符串分解爲字符,在每個字符之間插入「?」,並將結果字符串用作正則表達式? – octern

1

在這種特殊情況下,只需將該組字符放入正則表達式的中間作爲可選項即可。這特別有效,因爲你的匹配字符串中只有兩個字符,否則正則表達式可能會有點冗長。例如,匹配不區分大小寫的反對:

o[']*b 

您可以在中間添加更多的字符,該字符類忽略它們。需要注意的是*比賽任何字符(所以O「」'奧布萊恩將匹配)的數量 - 單實例,更改爲?

o[']?b 
+0

謝謝,請參閱我編輯的問題。我需要更通用的解決方案。 – XJones

+0

@XJones:你基本上只剩下Phrogz的解決方案,因爲你已經改變了問題來使其他一切無效。 – Tim

+0

是的,再次,我很抱歉不清楚。我不需要這麼基本的東西,但我想你無法知道這一點。謝謝你的時間。 – XJones

1

您可以將特定字符可選的一個問號,這意味着它會匹配他們是否是有或沒有,例如:

/o\'?b/ 

會匹配所有上述情況,加上.+任何一方以匹配所有其它字符和空格來表示姓的開始:

/.+? o\'?b.+/ 

並使用不區分大小寫的情況下使用大小寫不敏感修飾符。

+0

謝謝,請參閱我的編輯。我需要更通用的解決方案。 – XJones