2

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

当我搜索我想要得到的字符串isThis is my,当我搜索This我想要得到This istext结果应该是my text

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

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

也许你们中的某个人有一个想法。

感谢任何帮助

鲁文

4

5 回答 5

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 小提琴演示

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

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 小提琴演示

编辑以纠正 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(from test,如示例中所示)。该函数返回完整的单词(在本例中为test)。如果您想对该行为进行天真的更正,那么您可以轻松地添加if (needle == matches[0]) {/* do something */}检查,并按照您认为最好的方式改变行为。但我不完全确定最好的处理方法是什么。

参考:

于 2012-09-30T14:10:00.210 回答
1
'asd d This is my text a'.match(/\s(\w*\sis\s\w*)\s/)[1] //=> "This is my"
于 2012-09-30T13:39:46.920 回答
1

试试这个

这是工作示例

代码在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);
      }
  }
于 2012-09-30T13:44:22.820 回答
1

另一个解决方案:

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/

于 2014-10-23T12:17:51.113 回答
0

在我看来,对于“this i”等,您可以使用正则表达式、3 或 4 大小写以 ^this 开头?但如果不小心,这种搜索是不健康的。空格和不匹配的术语可能会产生难以匹配此 i* 的问题。for substring match match(/y​​oursearchterm/[A-Za-z0-9_-]*/i) 如果不匹配,则在 for 循环中使用 yoursearchterm 的子字符串,例如 yoursearchterm.substring(0,yoursearchterm.length-1) 尝试制作-1 到 -i 表示相似性,

全文搜索或 sql 中的类似表达式。为了获得更好的结果,用于 sql 的正则表达式可能会对您有所帮助,但它们都 {like 和 regex not very fast} .for 通过相似性进行匹配,例如 apple 是您的数据,而 appla 或 app 或 appl 或 eppl 是您的搜索,您可以让他们找到通过莱文斯坦。在 php http://php.net/manual/en/function.levenshtein.php 中,对于子字符串或长句,您可以使用按空间拆分{或分解}数据的方式。即我在这里,您的数据在这里拆分为 3,我是他们两个,您可以应用 lev 或喜欢正则表达式匹配成功,但您必须考虑查询的性能

于 2012-09-30T13:47:24.427 回答