我正在尝试做一个简单的正则表达式,其中我要做的就是匹配单词的单个部分,无论它是否有结尾的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个单词(它只针对我自己的表,而不是英语中的每个单词)。
谢谢! - 蒂姆
答案 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:
仅当您的字是该行中的唯一字词时,此功能才有效。
如果您的表名是该行中的许多单词之一,您可以使用表示空格的通配符替换$
(代表行尾)单词边界(根据上下文不同)。