来自以下字符串:
Some random text before pattern e-1-e-20-e-3
我想提取“模式前的一些随机文本”和[1、20、3]。
我认为这很简单,尝试了一些不同的方法,但是到目前为止,它们都没有起作用。
这是我的最后尝试:
(() => {
const text = 'Some random text --- e-1-e-20-e-3';
const re = /(.*)(?:\-?e\-([0-9]{1,2})\-?)+/g;
const matches = [];
let match = re.exec(text);
while (match != null) {
matches.push(match[1]);
match = re.exec(text);
}
console.log(matches)
})()
上一个返回[“ 3”],我不明白为什么。 我读了: -Getting all subgroups with a regex match -Javascript - Regex access multiple occurrences
我该如何解决这个问题?
编辑:
我已经改变
我想提取[1、20、3]。
收件人
我想提取“模式前的一些随机文本”和[1、20、3]。
我想我的问题是,我可以仅使用一个正则表达式来执行此操作,还是必须将搜索分为两部分?
答案 0 :(得分:1)
现在,您可以在单个迭代中一次匹配整个 e-1-e-20-e-3
子字符串。尝试只匹配一个 e-
部分,然后将捕获的组推入数组:
const text = 'Some random text --- e-1-e-20-e-3';
const re = /e\-([0-9]{1,2})/g;
const matches = [];
let match = re.exec(text);
while (match != null) {
matches.push(match[1]);
match = re.exec(text);
}
console.log(matches)
要也提取之前的文本,可以用(e-\d.*)
分割:
const text = 'Some random text before pattern e-1-e-20-e-3';
const [before, after] = text.split(/(e-\d.*)/);
console.log(before.trim());
const re = /e\-([0-9]{1,2})/g;
const matches = [];
let match = re.exec(after);
while (match != null) {
matches.push(match[1]);
match = re.exec(after);
}
console.log(matches)
答案 1 :(得分:1)
在这里,我们可以先收集所有字符,然后仅传递数字而使其他字符失效:
const regex = /([\s\S].*?)(\d+)/gm;
const str = `Some random text --- e-1-e-20-e-3`;
const subst = `$2\n`;
// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
如果不需要此表达式,可以在regex101.com中对其进行修改或更改。
jex.im还有助于可视化表达式。
我们还可以编写两个简单的表达式来完成此任务:
(.*)(\se-)
和
((e-)?(\d+)-?)?
如有必要,我们还可以使用逻辑OR将它们组合为一个表达式:
(.*)(\se-)|((e-)?(\d+)-?)?
const regex = /(.*)(\se-)|((e-)?(\d+)-?)?/gm;
const str = `Some random text before pattern e-1-e-20-e-3`;
const subst = `\n$1$5`;
// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
答案 2 :(得分:1)
您可以选择e-any digit
,然后可以从匹配项中替换e-
以获得所需的结果
const text = 'Some random text --- e-1-e-20-e-3';
const re = /e-\d{1,2}/g;
console.log(text.match(re).map(value=> value.replace(/e-/g,'')))
更新:-我想提取“模式前的一些随机文本”和[1、20、3]。
const text = 'Some random text before pattern e-1-e-20-e-3'
const [before,after] = text.split(/(e-\d.*)/)
console.log('text value -->',before)
const re = /e-\d{1,2}/g;
console.log('after text -->',after.match(re).map(value=> value.replace(/e-/g,'')))
答案 3 :(得分:0)
\d+
应该足以提取所有数字。
答案 4 :(得分:0)
实际上,您可以不使用正则表达式:
const text = `Some random text --- e-1-e-20-e-3`;
console.log(text.split("--- e-")[1].split("-e-"));
如果确实需要通过正则表达式进行操作,则可以使用:
(?<=e-)\d+
答案 5 :(得分:0)
您正在重复整个比赛,包括所捕获的小组。那只会给您捕获组的最后一个值。
您可以删除外部的非捕获组(?:)+
-?e-([0-9]{1,2})-?
修改
您可以使第一部分匹配直到e-和数字首次出现,然后将第一部分提取到组中。
例如:
(() => {
const text = 'Some random text --- e-1-e-20-e-3';
const re = /e-([0-9]{1,2})-?/g;
const matches = [text.replace(/^(.*?)e-\d/, "$1")];
let match = re.exec(text);
while (match != null) {
if (match.index === re.lastIndex) {
re.lastIndex++;
}
matches.push(match[1]);
match = re.exec(text);
}
console.log(matches)
})()