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

Tim*_*Tim 4 regex sublimetext

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

test
tests
Run Code Online (Sandbox Code Playgroud)

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

movie
movies
page
pages
time
times
Run Code Online (Sandbox Code Playgroud)

对于所有这些我需要在没有结束的情况下得到单词,但是我找不到一个正则表达式,它总是会抓住第一位而没有结尾的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
Run Code Online (Sandbox Code Playgroud)

我一直在使用http://gskinner.com/RegExr/来尝试不同的正则表达式.

编辑:这是一个崇高的文本片段,对于那些不知道崇高文本片段的人是一个快捷方式,以便我可以输入我的数据库的名称并点击"运行片段",它会把它变成某个东西喜欢:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

我只需要将"电影"变成"电影"并自动将其插入到foreach循环中.

这意味着我不能只对文本进行查找和替换,我只需要考虑60-70个单词(它只针对我自己的表,而不是英语中的每个单词).

谢谢! - 蒂姆

Tim*_*Tim 8

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

([a-zA-Z]+?)(s\b|\b)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 快速googlers要注意:当然,这不是**标题**中的问题的解决方案,所以请不要只复制粘贴它并在一天之内调用它.;)(它只解决了蒂姆8年前为他的一些内部使用的剧本所需要的一个特殊子句.只是说,'因为谷歌也把我放在这里,我花了一些时间才弄明白发生了什么"显然错误的"正则表达式." (2认同)

Boh*_*ian 6

对于简单的复数,使用这个:

test(?=s| |$)
Run Code Online (Sandbox Code Playgroud)

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

part(y|i)(?=es | )
Run Code Online (Sandbox Code Playgroud)

会返回“party”或“parti”,但我不确定你用它做什么

  • @Tim 你能试着自己做一点工作吗?循环遍历您的单词并添加此处描述的结尾以将它们转换为正则表达式有多难? (4认同)