regex 从匹配的正则表达式中获取子字符串

zzlelutf  于 2023-05-30  发布在  其他
关注(0)|答案(3)|浏览(155)

我有一个正则表达式

const regex = new RegExp(/^\${[a-z][a-z0-9_]*}\/\${[a-z][a-z0-9_]*}$/, 'g');

匹配字符串"${total_123}/${number_items}"。接下来,我想提取子字符串total123number_items并将它们设置为
const numerator = total_123const denominator = number_items。我不太清楚该怎么做。

oaxa6hgo

oaxa6hgo1#

const regex = new RegExp(/^\${([a-z][a-z0-9_]*)}\/\${([a-z][a-z0-9_]*)}$/, 'g');
const string = "${total_123}/${number_items}";

const matches = string.match(regex);

if (matches) {
  const numerator = matches[1];
  const denominator = matches[2];

  console.log("numerator:", numerator); // "total_123"
  console.log("denominator:", denominator); // "number_items"
}

正则表达式模式中括号中的部分表示组。这些组可以使用matches数组单独捕获,其中元素位于索引1和2。这允许您单独捕获括号中的表达式。

klsxnrf1

klsxnrf12#

您需要将变量存储在对象中,然后根据需要访问其属性:

const variables = {
  total_123: 42,
  number_items: 0xf00
};

// Destructure the match, take the second and third element but skip the first.
const [, group1, group2] = text.match(regex);

const numerator = variables[group1];
const denominator = variables[group2];

另外,只需使用literal语法声明正则表达式:

const regex = /^\${([a-z][a-z0-9_]*)}\/\${([a-z][a-z0-9_]*)}$/;

请注意,由于正则表达式没有m标志,因此^表示字符串的开头,$表示字符串的结尾。也就是说,我们最多可以得到一个匹配,并且g标志是不必要的(事实上,如果我们使用.match()而不是.matchAll(),它甚至会阻止我们访问组)。
试试看:

console.config({ maximize: true });

const regex = /^\${([a-z][a-z0-9_]*)}\/\${([a-z][a-z0-9_]*)}$/;
const text = '${total_123}/${number_items}';

const variables = {
  total_123: 42,
  number_items: 0xf00
};

const match = text.match(regex);
console.log({match});

// fullMatch is not needed, it's just there for the sake of readability.
const [_fullMatch, group1, group2] = match;
console.log({group1, group2});

const numerator = variables[group1];
const denominator = variables[group2];

console.log(`${numerator}/${denominator}`);
<script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script>
smtd7mpg

smtd7mpg3#

首先是一些评论:

  • 你不需要调用RegExp构造函数。只需要使用regex literal。
  • 由于g标志可以有多个匹配项,因此需要一个循环
  • 您可以使用命名的捕获组,如(?<numerator> )

代码:

const regex = /^\${(?<numerator>[a-z][a-z0-9_]*)}\/\${(?<denominator>[a-z][a-z0-9_]*)}$/g;
const s = "${total_123}/${number_items}";

for (const {groups: {numerator, denominator}} of s.matchAll(regex)) {
    console.log(numerator, denominator);
}

相关问题