是否有正则表达式来匹配不一定完整的字符串?
示例:
- 其他一些 supercalifragilisticexpialidocious 随机的东西
- 并且可能 supercalifragilistic 无意义的填充
- lorem superca ipsum dolor
醇>
我希望每次都匹配 supercalifragilisticexpialidocious 的左侧部分。词语周围不一定有空格。
预期的结果是找到:
- 的 supercalifragilisticexpialidocious信息
- 的 supercalifragilistic
- 的 superca
醇>
这类似于任意次数匹配相同的字符,但更通用。
谢谢!
答案 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;
}
答案 1 :(得分:2)
有,但它根本不整洁(也可能不是非常高效)。此正则表达式匹配左侧至少3个字符,最多匹配supercal
。扩展它的方式应该相当简单。
(?:sup(?:e(?:r(?:c(?:a(?:l)?)?)?)?)?)?
保罗的回答在一般情况下可能更有用。
答案 2 :(得分:0)
以下是另一种解决方案。它与Paul的相似之处在于它使用indexOf
而不是正则表达式。这也使它同样区分大小写。在Paul的解决方案会导致过多调用indexOf
的特殊情况下,我的方法应该会表现得更好;通常在:
如果您不是这种情况,那么请使用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);
}