正则表达式包含单词的一部分

时间:2015-04-14 16:02:45

标签: ruby-on-rails regex

所以我几乎没有需要使用正则表达式匹配的单词。

steve jobs
steve
bill gates
mark
stevejobs

现在我想查找包含此字符串stevejobs

一部分的所有名称

现在我应该steve jobsstevestevejobs

我可以使用此表达式steve(?:jobs?)?

来实现此目的

但我的代码并不知道将一个单词拆分为两个名称,即从stevejobsstevejobs

所以这个词可以是任何内容,它可以是ntechi并且会匹配technologytechnical,因为tech是这两个词的一部分。

可以这样做吗?

2 个答案:

答案 0 :(得分:0)

完成评论后,您似乎正在寻找任何子字符串2个或更多字符的匹配项。所以ntechi会因为ch而匹配聊天。

由于任何超过2的子字符串实际上由2的多个子字符串组成,我们只需要遍历2的所有子字符串:

$mylist = array(
    'steve jobs',
    'steve',
    'bill gates',
    'mark',
    'stevejobs'
);
for ($j = 0; $j < count($mylist); $j++)
    for ($i = 0; $i < strlen($str)-1); $i++)
        if (strstr(substr($str, $i, $i+1), $mylist[$j])) {
            echo $mylist[$j]." contains ".substr($str, $i, $i+1);
            break; // this will keep the same one from being reported multiple times
        }

不幸的是,这不会告诉你最长的匹配,但它会列出你的数组中匹配的项目。

哦,我的道歉 - 我只是注意到你使用ruby-on-rails而不是PHP。希望您可以将PHP代码视为伪代码并将其转换为ruby。

答案 1 :(得分:0)

由于您不知道拆分字符串的位置,因此您只能搜索与任何可能的子字符串匹配的字符串。设置一个最小长度可能是一个好主意,这样你就不会只包括&#34; bill gate&#34;因为它包含子串&#34; e&#34;。您可以按匹配的子字符串长度对匹配进行排序 - 匹配的子字符串越长,匹配就越好。

首先,您会发现一些函数返回所有子字符串here