如何根据另一个文本(格式不同(缩进等))中的一个文本获取子字符串?

时间:2018-07-24 12:01:49

标签: javascript string text

考虑到任意文本,我想在其中识别特定文本。到目前为止,我一直在编写代码,但是,要找到某种方法来解决这个问题真的很困难。

重要的一点是,当我得到文本时,空格是一定数量的,但是在我得到其他文本进行比较之后,这就是为什么我不需要关心空格的数量。

第一个文本示例:

Here, bla bla bla bla

() => console.log()

end

要根据第一个文本在第二个文本上选择的文本示例:

() => console.log()

用于选择我想要的值的第二个文本示例

Here, bla     bla     bla bla

() => console.    log()

en d

只需记住一些标准:

  • 单词之间的空格可能会变化,跳转线可能会更多
  • 我需要将其他文本中的某些字母与其他格式匹配,无论它们之间的空格或跳线如何

直到现在我的代码:

let firstCharCode = mainText.replace(/ /g,'').indexOf(textToBeSelected.replace(/ /g, ''))
let lastCharCode = firstCharCode + textToBeSelected.replace(/ /g, '').length - 1
let numberOfCharsToSelect = lastCharCode - firstCharCode

for (let i = 0; i < a.length; i++) {
  // iterate through them checking where is the chars?
}

2 个答案:

答案 0 :(得分:1)

此功能应该可以解决您的问题。

searchWithoutBlanks(text, search)如果在true中发现了search,则返回text,而没有查看空格。

以下是摘要:

-删除搜索中的所有空格

-遍历搜索字符并转义它们,并在每个字符后添加\s*?

-使用此新生成的Regex测试您的初始文本。

const text = `
Here, bla bla bla bla

() => console.log()

end
`;

//Utility function to escape a String for RegExp use
const escapeRegExp = str => str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");

const searchWithoutBlanks = (string, search) => {
  let sanitizedSearch = search.replace(/\s+/g, ''); //Removes any whitespace
  let regexString = '';
  for(let i = 0; i < sanitizedSearch.length; i++){  //Loop on your search
    regexString += escapeRegExp(sanitizedSearch[i]) + '\\s*?';  //Add \s*? after each sanitized char
  }
  console.log(regexString); //Here is the resulting RegExp
  return new RegExp(regexString).test(string);
}

console.log(searchWithoutBlanks(text,'()=>console.log()'));
console.log(searchWithoutBlanks(text,'this shouldn\'t match'));

答案 1 :(得分:1)

这里是一个示例,但不确定其性能如何。

基本上是从文本中查找一个RegExp:首先删除空格,然后转义regexp字符(当心,必须用每个regexp字符来完成),然后在每个char之间添加对任何字符的期望空格或跳线。

然后,很容易使用indexOf获取比赛的索引。

const text = `Here, bla     bla     bla bla

() => console.    log()

en d`;
const target = '() => console.log()';

const escapeRegexp = c => c.replace(/[)(.]/g, c => `\\${c}`); // Protect every regexp char here.

const regexp = new RegExp(target.replace(/\s/g, '').split('').map(escapeRegexp).join('\\s*') ,'g');
const results = regexp.exec(text);

results.map(r => console.log(`Find match '${r}' starting at index ${text.indexOf(r)} and ending at index ${text.indexOf(r) + r.length}`));

注意:要从RegExp语法正确地转义字符串:Escape string for use in Javascript regex

相关问题