返回搜索的字符串+上一个和下一个字

时间:2012-09-30 13:35:31

标签: javascript ajax string match

我有一个这样的字符串: This is my text

当我搜索is之类的字符串时,我希望得到This is my,当我搜索This时,我想获得This istext {1}}结果应为my text

所以我总是尝试找到一个字符串并获取搜索到的字符串+上一个和下一个字(如果存在)。

我知道我可以用mystring.match('search')搜索一个字符串,给我索引但我怎么走得更远,可能使用split

也许有人有个主意。

获取任何帮助

ruven

5 个答案:

答案 0 :(得分:3)

我建议使用以下方法,该方法使用一种功能方法,允许您传递要搜索的单词和搜索该单词的字符串:

function findWordAndNeighbours(needle, haystack) {
    if (!needle || !haystack) {
        return false;
    }
    else {
        var re = new RegExp('(\\S+[\\b\\s]' + needle + '[\\b\\s]\\S+)', 'i'),
            foundWords = haystack.match(re)[0].split(/\s+/),
            foundFragment = foundWords.join(' ');
        return foundFragment;
    }
}

var sentenceFragment = findWordAndNeighbours('test', 'This is a Test of a matching thing.');

console.log(sentenceFragment);

JS Fiddle demo

已编辑以更新上述内容以包含一些错误捕获,基本上在尝试使用这些匹配项之前检查 某些正则表达式匹配:

function findWordAndNeighbours(needle, haystack) {
    if (!needle || !haystack) {
        return false;
    }
    else {
        var re = new RegExp('(\\S+[\\b\\s]' + needle + '[\\b\\s]\\S+)', 'i'),
            matches = haystack.match(re);
        if (matches) {
            // this is for if you wanted the individual words (as an array)
            var foundWords = haystack.match(re)[0].split(/\s+/),
                // this is to return the found sentence-fragment:
                foundFragment = foundWords.join(' ');
            return foundFragment;
        }
        else {
            /* this just follows the indexOf() pattern of, if you'd rather
               'return false' instead, that's entirely your call. */
            return -1;
        }
    }
}

var sentenceFragment = findWordAndNeighbours('test', 'This is a Test of a matching thing.');

console.log(sentenceFragment);

JS Fiddle demo

已编辑以在评论中纠正OP识别的问题(如下):

  

但如果你搜索This或thing,那么这将不起作用,所以第一个或最后一个单词

使用?操作数/特殊字符(意思是匹配前面的字符/组零或一次,)似乎可以纠正在提供的第一个和最后一个字中搜索的问题字符串。

function findWordAndNeighbours(needle, haystack) {
    if (!needle || !haystack) {
        return false;
    }
    else {
        var re = new RegExp('((\\S+[\\b\\s]?)' + needle + '([\\b\\s]?\\S+))', 'i'),
            matches = haystack.match(re);
        console.log(matches);
        if (matches) {
            var foundWords = haystack.match(re)[0].split(/\s+/),
                foundFragment = foundWords.join(' ');
            return foundFragment;
        }
        else {
            return -1;
        }
    }
}

var sentenceFragment = findWordAndNeighbours('es', 'This is a Test of a matching thing.');

console.log(sentenceFragment);

但是我无法找到一种从给定单词中搜索子字符串的简洁方法,例如es(来自test,如示例中所示)。该函数返回完整的单词(在本例中为test)。如果您想要对该行为进行简单的更正,那么我可以轻松添加if (needle == matches[0]) {/* do something */}检查,并根据您的想法改变行为。但我不完全确定最好的办法是什么。

参考文献:

答案 1 :(得分:1)

'asd d This is my text a'.match(/\s(\w*\sis\s\w*)\s/)[1] //=> "This is my"

答案 2 :(得分:1)

试试这个

这是有效的example

代码在javascript中

var str = "This is my text";

var strArr = str.split(" ");

var seacrhWord = "is";

for (i=0; i<strArr.length; i++)
   {
      if ( strArr[i] == seacrhWord)
      {
          var result = "";
          if (strArr[i-1] != null)
             result += strArr[i-1]

          result += " " + strArr[i];

          if (strArr[i+1] != null)
             result += " " + strArr[i+1];

          alert(result);
      }
  }

答案 3 :(得分:0)

在我看来对于“这个我”等你可以使用正则表达式,3或4个案例 从^开始?但如果不小心,这种搜索是不可取的。空间和不匹配的术语可能会产生难以匹配的问题 这个我*。用于子串匹配匹配(/ yoursearchterm / [A-Za-z0-9 _-] * / i) 如果不匹配则使用yoursearchterm的子字符串 yoursearchterm.substring(0,yoursearchterm.length-1) 在for循环中尝试将-1设为-1以获得相似性,

sql中的全文搜索或类似表达式。 为了获得更好的结果,正则表达式可以帮助你,但他们两个{喜欢和正则表达式不是很快}。匹配相似性 喜欢 apple是你的数据 并且appla或app或appl或eppl是您的搜索 你可以让他们找到通过 莱文斯坦。在php http://php.net/manual/en/function.levenshtein.php 对于子字符串或长句,你可以使用它的方式 按空格分割{或爆炸}数据 。即我在这里 和你的数据分裂3 我在这里 他们两个你可以应用lev或像正则表达式 匹配是成功的,但你必须考虑性能你的查询

答案 4 :(得分:0)

又一个解决方案:

var input = 'Text? This is my simple text string where I use word TEXT a few times. Is it finding my text?'
var text = 'text';

input = input.toString();
text = text.toString().replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');

var preLength = 7;

var search = function () {
    if (position !== -1) {
        var sliceStart = (position - preLength) >= 0 ? position - preLength : 0;
        var sliceEnd = position + text.length + preLength;

        var matchedText = input.slice(sliceStart, sliceEnd).trim();

        var preText = ((position - preLength) >= 0) && !result.length ? '...' : '';
        var postText = input.slice(sliceEnd).trim().length > 0 ? '...' : '';

        result = result + preText + matchedText + postText;

        input = input.slice(sliceEnd);
        lowercaseInput = lowercaseInput.slice(sliceEnd);

        position = lowercaseInput.search(lowercaseText);
    }
}

var lowercaseInput = input.toLowerCase();
var lowercaseText = text.toLowerCase();

var result = '';
var position = lowercaseInput.search(lowercaseText);

while (position !== -1) {
    search();
}

console.log(result);

这将查找搜索到的文本并返回包含所有匹配项的结果。

http://jsfiddle.net/bqwn1whq/