2012-07-10 599 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