正则表达式以不同的顺序查找单词

时间:2010-10-23 13:41:44

标签: regex

我正在寻找一种模拟RegEx的方法,当搜索“sun shining”时,它会为这两个字符串提供匹配。

  1. the sun is shining
  2. a shining sun is nice

4 个答案:

答案 0 :(得分:4)

我会为每个单词使用正面的前瞻,就像这样(你可以添加任意数量的单词):

(?=.*?\bsun\b)(?=.*?\bshining\b).*

答案 1 :(得分:2)

基本正则表达式不能很好地处理不同的单词顺序。有办法做到这一点,但正则表达式变得丑陋,除了正则表达式大师以外都不可读。在大多数情况下,我更愿意选择可读性。

我的建议是使用简单的or变体,例如:

sun.+shining|shining.+sun
如有必要,

带有字边界:

\bsun\b.+\bshining\b|\bshining\b.+\bsun\b

正如Lucero指出的那样,随着您搜索的单词数量的增加,这将变得难以处理,在这种情况下,我会选择多个正则表达式匹配解决方案:

def hasAllWords (string, words[]):
    count = words[].length()
    for each word in words[]:
        if not string.match ("\b" + word + "\b"):
            return false
    return true

该伪代码将对每个单词进行检查,并确保所有单词出现。

答案 2 :(得分:1)

您需要使用一个正则表达式来考虑每个排列:

\b(sun\b.+\bshining|shining\b.+\bsun)\b

此处,单词边界\b仅用于匹配单词sunshining,而不用于“晴天”中的子单词。

答案 3 :(得分:0)

你使用两个正则表达式。

if ( ( $line =~ /\bsun\b.+\bshining\b/ ) ||
     ( $line =~ /\bshining\b.+\bsun\b/ ) ) {
   # do whatever
}

有时你必须做一些看似低技术的事情。这个问题的其他答案将让你构建复杂的正则表达式与交替和前瞻等等,但有时最好的方法是以最简单的方式做到这一点,在这种情况下,它是使用两个不同的正则表达式。

不要担心执行速度。除非您将此解决方案与其他更复杂的单表达式解决方案进行比较,否则您不知道哪个更快。写慢速正则表达式非常容易。