正则表达式查找包含在两个不同字符串之间的文本及其在输入字符串中的位置



在带有正则表达式的 JavaScript 中,我必须从一长串文本中提取包含在两个字符串 "---ST---" 和 ---EN---" 之间的文本,例如,我的文本字符串是:

---ST---blah blah blah---EN--- other text ---ST--- foo bar baz ---EN--- other other text ---ST---the cat is on the table---EN---

我必须得到每一个---ST---/---EN---夫妇发现这样的对象:

[{textFound:"blah blah blah", startsAt:0, endsAt:22},
{textFound:" foo bar baz ", startsAt:42, endsAt:64},
...]

我尝试了以下方法,但它不起作用:

function getSTEN(input){
var r =[];
var expression = /---ST---(.*?)---EN---/gi;
var matches = input.match(expression);
for(match in matches)
    {
        var result = {};
        result['textFound'] = matches[match];
        result['startsAt'] = input.indexOf(matches[match]);
        //...
     };
     return r;
};
var str = "---ST---blah blah blah---EN--- other text ---ST--- foo bar baz ---EN--- other other text ---ST---the cat is on the table---EN---";
console.log(getSTEN(str));

你可以帮我吗?

您可以使用以下代码来收集所需的数据(我猜endsAtm.index+捕获的字符串长度+ 8(---ST---的长度)的总和):

function getSTEN(str) {
  
  var r = [];
  var re = /-{3}ST-{3}(.*?)-{3}EN-{3}/g; 
  var m;
 
  while ((m = re.exec(str)) !== null) {
     var result = {};   
     result['textFound'] = m[1];
     result['startsAt'] = m.index;
     result['endsAt'] = m.index + m[1].length + 8;
     r.push(result);
  }
  return r;
}
var str = "---ST---blah blah blah---EN--- other text ---ST--- foo bar baz ---EN--- other other text ---ST---the cat is on the table---EN---";
var rs = getSTEN(str);
document.getElementById("res").innerHTML = "[";
for (i = 0; i < rs.length; i++) {
  document.getElementById("res").innerHTML += "{textFound:"" + rs[i]['textFound'] + "", startsAt:" + rs[i]['startsAt'] + ", endsAt:" + rs[i]['endsAt'] + "}";
  if (i < rs.length-1)
     document.getElementById("res").innerHTML += ",";
}
document.getElementById("res").innerHTML += "]";
<div id="res" />

你的函数实际上没问题。我会稍微改变一下。假设您真的只想要 st-en 之间的字符串,那么您的正则表达式将保持原样,但匹配对我们没有太大帮助。你需要exec()

var matches = expression.exec(input);

然后你可以为你的匹配项。答案实际上在堆栈溢出 https://stackoverflow.com/a/432503/2582496<</p>

div class="one_answers"上找到>我认为

您的问题是您在每个匹配中使用"匹配[匹配]"而不是"匹配"。

如果您对如何使用 a 感到困惑,这很好地解释了它:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for_each...in。

你不需要正则表达式。

试试这个: jsfiddle.net/marcelortega/nnko5ebf/

编辑:这是新的小提琴

最新更新