用于查找包含在两个不同字符串之间的文本及其在输入字符串中的位置的正则表达式
Regex to find text contained between two different strings and their position in the input string
在使用正则表达式的 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));
你能帮帮我吗?
你的功能其实没问题。我会稍微改变一下。假设,您真的只需要 st-en 之间的字符串,那么您的正则表达式将保持原样,但匹配对我们帮助不大。你需要 exec()
var matches = expression.exec(input);
然后你可以foreach你的比赛。实际上在 Whosebug
上找到了答案
您不需要正则表达式。
试试这个:jsfiddle.net/marcelortega/nnko5ebf/
我认为您的问题是您在 for each 中使用 'matches[match]' 而不是 'match'。
如果您对如何使用 a for each 感到困惑,这解释得很好:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for_each...in。
你可以用下面的代码来收集你需要的数据(我猜endsAt
就是m.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" />
在使用正则表达式的 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));
你能帮帮我吗?
你的功能其实没问题。我会稍微改变一下。假设,您真的只需要 st-en 之间的字符串,那么您的正则表达式将保持原样,但匹配对我们帮助不大。你需要 exec()
var matches = expression.exec(input);
然后你可以foreach你的比赛。实际上在 Whosebug
上找到了答案您不需要正则表达式。
试试这个:jsfiddle.net/marcelortega/nnko5ebf/
我认为您的问题是您在 for each 中使用 'matches[match]' 而不是 'match'。
如果您对如何使用 a for each 感到困惑,这解释得很好:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for_each...in。
你可以用下面的代码来收集你需要的数据(我猜endsAt
就是m.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" />