2012-07-10 600 views
3

我想要做什麼應該是一個簡單的正則表達式,我所要做的就是匹配一個單詞的單數部分,不管它是否有s最後。所以,如果我有以下的話正則表達式 - 如何搜索單數或複數形式的單詞

test 
tests 

編輯:進一步的例子,我需要這對很多話有可能不只是這兩個

movie 
movies 
page 
pages 
time 
times 

對於所有的人,我需要得到這個詞沒有結束,但我找不到一個正則表達式,總是會在沒有結束的情況下抓住第一位,併爲這兩種情況工作。

我已經試過如下:

([a-zA-Z]+)([s\b]{0,}) - This returns the full word as the first match in both cases 
([a-zA-Z]+?)([s\b]{0,}) - This returns 3 different matching groups for both words 
([a-zA-Z]+)([s]?) - This returns the full word as the first match in both cases 
([a-zA-Z]+)(s\b) - This works for tests but doesn't match test at all 
([a-zA-Z]+)(s\b)? - This returns the full word as the first match in both cases 

我一直在使用http://gskinner.com/RegExr/爲嘗試不同的正則表達式的。

編輯:這是一個崇高的文本片段,對於那些不知道在崇高文本片段是一個快捷方式,以便我可以鍵入說我的數據庫的名稱,並打「運行代碼片段」,它會把它變成類似於:

$movies= $this->ci->db->get_where("movies", ""); 
if ($movies->num_rows()) { 
    foreach ($movies->result() AS $movie) { 

    } 
} 

我所需要的就是將「電影」變成「電影」並自動將其插入到foreach循環中。

這意味着我不能只在文本上查找和替換,我只需要考慮60-70個單詞(它只針對我自己的表格運行,而不是英語中的每個單詞)。

謝謝! 蒂姆 -

+0

你想要一個特定的單詞匹配,或任意的單詞?此外,它並不總是* s *,有時它是* es *。 – R0MANARMY 2012-07-10 02:04:18

+2

英文複數形式,即使不包括不規則形式,也不像刪除's'那麼簡單。你會如何處理諸如「西紅柿」或「派對」或「葉子」(葉子)的情況? – nhahtdh 2012-07-10 02:04:22

+1

是的,我意識到,在這種情況下,我只有幾個字,這個正則表達式將被用來反對,所有有/沒有結束。 – Tim 2012-07-10 02:05:59

回答

8

好,我找到一個解決方案:

([a-zA-Z]+?)(s\b|\b) 

按需要工作,那麼你可以簡單地使用第一個匹配作爲單詞的非數字化版本。

謝謝@Jahroy幫我找到它。我爲未來的衝浪者添加了這個答案,他們只是想要一個解決方案,但請查看Jahroy的更多深入信息的評論。

2

這裏是你如何可以做到這一點vi或sed的:

s/\([A-Za-z]\)[sS]$/\1 

,取代了一堆以s結尾的一切,但最後一個字母的字母。

注:

逃逸字符(括號中前反斜槓)可能是在不同環境下的不同。

ALSO:

\1(這意味着第一圖案)根據上下文也可以變化。

ALSO:

如果您是上線的只有一個字這隻會工作。

如果你的表名就行了很多言,你很可能更換$(代表結束)與代表空格或單詞邊界通配符(這些不同基於上下文)。

+0

謝謝!我瀏覽了一下你的編輯,發現最後的編輯幫了很大忙(解釋了做一個或者用空白)。我用下面的正則表達式解決了它:([a-zA-Z] +?)(s \ b | \ b)(然後我只抓住第一組) – Tim 2012-07-10 02:39:43

+0

很酷。我錯過了'sublimetext'標籤,所以我想知道我是否應該甚至沒有打擾過。 'sublimetext'中的所有上述構造可能略有不同,但我的回答應該讓你朝着正確的方向前進。 (隨意上傳) – jahroy 2012-07-10 02:41:25

+0

我沒有添加,因爲我認爲我可以保留它的通用性,因爲它實際上只是一個正則表達式問題,可以應用於許多不同的用例。不幸的是,許多用戶討論了上下文,而不是實際幫助找到解決方案 – Tim 2012-07-10 02:48:41

2

對於簡單的複數,使用此:

test(?=s| |$) 

對於更復雜的複數,你就麻煩了使用正則表達式。例如,此正則表達式

part(y|i)(?=es |) 

將返回「方」或「雜色」,但你與該做什麼我不知道

+0

你能否以某種方式編寫它,因此它適用於很多單詞,而不僅僅是「測試」和「測試」。 – Tim 2012-07-10 02:20:32

+4

@Tim你可以嘗試自己做一些工作嗎?僅僅循環你的單詞並添加這裏描述的結果來將它們轉化爲正則表達式會有多難? – R0MANARMY 2012-07-10 02:22:49

+0

只要搜索以's'結尾的表達式,如果您只是搜索數據庫表......但是如果表名以'S'結尾並且單數? – jahroy 2012-07-10 02:23:53