正则表达式 - 如何搜索单词或复数版本的单词

时间:2012-07-10 02:00:54

标签: regex sublimetext

我正在尝试做一个简单的正则表达式,其中我要做的就是匹配单词的单个部分,无论它是否有结尾的s。如果我有以下的话

test
tests

编辑:进一步的例子,我需要这个可以用于许多单词而不仅仅是那两个

movie
movies
page
pages
time
times

对于所有这些我需要在没有结尾的情况下获得单词,但是我找不到一个正则表达式,它总是会抓住第一位而没有结尾的s并且适用于两种情况。

我尝试了以下内容:

([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个单词(它只针对我自己的表,而不是英语中的每个单词)。

谢谢! - 蒂姆

3 个答案:

答案 0 :(得分:8)

好的,我找到了解决方案:

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

根据需要工作,然后你可以简单地使用第一个匹配作为单词的无法使用的版本。

感谢@Jahroy帮助我找到它。我添加了这个作为未来冲浪者的答案,他们只想要一个解决方案,但请查看Jahroy的评论以获取更多深度信息。

答案 1 :(得分:3)

对于简单复数,请使用:

test(?=s| |$)

对于更复杂的复数,你在使用正则表达式时遇到了麻烦。例如,这个正则表达式

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

将返回“派对”或“parti”,但你做了什么我不确定

答案 2 :(得分:2)

以下是使用vi或sed执行此操作的方法:

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

用一个除了最后一个字母之外的所有字母替换了一堆以S结尾的字母。

注:

  

转义字符(parens之前的反斜杠)在不同的上下文中可能会有所不同。

ALSO:

  

\1(意思是第一个模式)也可能因上下文而异。

ALSO:

  

仅当您的是该行中的唯一字词时,此功能才有效。

如果您的表名是该行中的许多单词之一,您可以使用表示空格的通配符替换$(代表行尾)单词边界(根据上下文不同)。