正则表达式:匹配不完整的搜索字符串

时间:2014-12-06 19:51:31

标签: regex

是否有正则表达式来匹配不一定完整的字符串?

示例:

  
      
  1. 其他一些 supercalifragilisticexpialidocious 随机的东西
  2.   
  3. 并且可能 supercalifragilistic 无意义的填充
  4.   
  5. lorem superca ipsum dolor
  6.   

我希望每次都匹配 supercalifragilisticexpialidocious 的左侧部分。词语周围不一定有空格。

预期的结果是找到:

  
      
  1. supercalifragilisticexpialidocious信息
  2.   
  3. supercalifragilistic
  4.   
  5. superca
  6.   

这类似于任意次数匹配相同的字符,但更通用。

谢谢!

3 个答案:

答案 0 :(得分:2)

我知道这不是正则表达式,但我认为使用代码可以更好地实现目标。这是一个JavaScript函数的示例,它尽可能多地匹配输入字符串:

function matchMost(find, string){   
    for(var i = 0 ; i < find.length ; i++){
        for(var j = find.length ; j > i ; j--){ 
            if(string.indexOf(find.substring(i, j)) !== -1){
                return find.substring(i, j);
            }
        }
    }
    return false;
}

例如,如果您调用matchMost("supercalifragilisticexpialidocious", "lorem superca ipsum dolor"),它将返回字符串“superca”。如果string不包含find中的单个字符,则该函数将返回false。

这是一个JS小提琴,您可以在其中测试此代码:http://jsfiddle.net/n252eyw1/


<强>更新

此函数尽可能多地匹配输入字符串的左侧:

function matchMostLeft(find, string){   
    for(var j = find.length ; j > 0 ; j--){ 
        if(string.indexOf(find.substring(0, j)) !== -1){
            return find.substring(0, j);
        }
    }
    return false;
}

JS小提琴:http://jsfiddle.net/sjy312ae/

答案 1 :(得分:2)

有,但它根本不整洁(也可能不是非常高效)。此正则表达式匹配左侧至少3个字符,最多匹配supercal。扩展它的方式应该相当简单。

(?:sup(?:e(?:r(?:c(?:a(?:l)?)?)?)?)?)?
保罗的回答在一般情况下可能更有用。

答案 2 :(得分:0)

以下是另一种解决方案。它与Paul的相似之处在于它使用indexOf而不是正则表达式。这也使它同样区分大小写。在Paul的解决方案会导致过多调用indexOf的特殊情况下,我的方法应该会表现得更好;通常在:

  • 针很长(比 supercalifragilisticexpialidocious 更差),
  • 您需要扫描很多单独的文本,
  • 大多数文本要么不匹配,要么只包含短匹配。

如果您不是这种情况,那么请使用Paul的解决方案,因为它简洁易读。

function getLongestMatchingPrefix(needle, haystack) {
    var len = 0;
    var i = 0;
    while (len < needle.length && (i = haystack.substring(i).indexOf(needle.substring(0, len + 1))) >= 0) {
        while (++len < needle.length && haystack.substring(i, i + len + 1) == needle.substring(0, len + 1)) {}
    }
    return needle.substring(0, len);
}

小提琴:http://jsfiddle.net/ov26msj5/