我有一个这样的字符串:
This is my text
当我搜索is
之类的字符串时,我希望得到This is my
,当我搜索This
时,我想获得This is
和text
{1}}结果应为my text
所以我总是尝试找到一个字符串并获取搜索到的字符串+上一个和下一个字(如果存在)。
我知道我可以用mystring.match('search')
搜索一个字符串,给我索引但我怎么走得更远,可能使用split
?
也许有人有个主意。
获取任何帮助
ruven
答案 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);
已编辑以更新上述内容以包含一些错误捕获,基本上在尝试使用这些匹配项之前检查 某些正则表达式匹配:
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);
已编辑以在评论中纠正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);
这将查找搜索到的文本并返回包含所有匹配项的结果。