kak*_*ppa 6 javascript string pattern-matching
我需要使用Javascript找到几个单词或匹配模式.
这是要求.
我有一个像这样的字符串,
这是下次您喜欢的石油和其他主题的快速指南
我需要将此字符串与这样的字符串匹配
favorite oil and some other topics can be based on something blah blah
Run Code Online (Sandbox Code Playgroud)
我如何获得匹配的文本块的交集?
我已经尝试了相交的Javascript脚本函数,对于某些字符串,它无法正常工作.
如何解决这个问题呢?这可以使用Regex完成吗?
请指教.
你必须找到最长的公共子串.
如果琴弦不长,我推荐使用Tim的方法.否则,这是具有动态编程的最长公共子串算法的Javascript实现.运行时为O(mn),其中m和n分别是2个字符串的长度.
示例用法:
var first = "Here is a quick guide for the next time you reach for your favorite oil and some other topics";
var second = "favorite oil and some other topics can be based on something blah blah";
console.log(first.intersection(second)); // ["favorite oil and some other topic"]
Run Code Online (Sandbox Code Playgroud)
这是算法实现.它返回最长公共子串的数组.扩展了本机String类,因此所有字符串都可以使用intersect方法.
String.prototype.intersection = function(anotherString) {
var grid = createGrid(this.length, anotherString.length);
var longestSoFar = 0;
var matches = [];
for(var i = 0; i < this.length; i++) {
for(var j = 0; j < anotherString.length; j++) {
if(this.charAt(i) == anotherString.charAt(j)) {
if(i == 0 || j == 0) {
grid[i][j] = 1;
}
else {
grid[i][j] = grid[i-1][j-1] + 1;
}
if(grid[i][j] > longestSoFar) {
longestSoFar = grid[i][j];
matches = [];
}
if(grid[i][j] == longestSoFar) {
var match = this.substring(i - longestSoFar + 1, i);
matches.push(match);
}
}
}
}
return matches;
}
Run Code Online (Sandbox Code Playgroud)
还需要此辅助函数来创建一个所有元素初始化为0的二维数组.
// create a 2d array
function createGrid(rows, columns) {
var grid = new Array(rows);
for(var i = 0; i < rows; i++) {
grid[i] = new Array(columns);
for(var j = 0; j < columns; j++) {
grid[i][j] = 0;
}
}
return grid;
}
Run Code Online (Sandbox Code Playgroud)