RegEx用于提取字符串中的分散数字

时间:2019-05-20 05:38:35

标签: javascript regex

来自以下字符串:

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]。

我想我的问题是,我可以仅使用一个正则表达式来执行此操作,还是必须将搜索分为两部分?

6 个答案:

答案 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);

RegEx

如果不需要此表达式,可以在regex101.com中对其进行修改或更改。

enter image description here

RegEx电路

jex.im还有助于可视化表达式。

enter image description here


我们还可以编写两个简单的表达式来完成此任务:

(.*)(\se-)

((e-)?(\d+)-?)?

如有必要,我们还可以使用逻辑OR将它们组合为一个表达式:

(.*)(\se-)|((e-)?(\d+)-?)?

enter image description here

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+

演示:https://regex101.com/r/WH9b4K/1/

答案 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)
})()