在不使用 lookbehind 的情况下查找字符串后的一组数字

Find set of numbers after string without using lookbehind

我已经挠头好一阵子了。我正在尝试使用正则表达式在特定字符串之后获取一组数字。我正在使用正向后视,但许多浏览器不支持它。那么有没有办法在不使用 lookbehind 的情况下为此 构建模式?

在下面的示例中,我只想获取字符串 Test 之后的数字,因此它应该只是 1234567891。这是多行。

字符串 1:

Test 12345

字符串 2:

Test 12345, 67891
Sample 0101, 0202

这是我在后视的两个示例中使用的模式:

/(?<=Test )\d+|(?<=, )\d+/gm

如果我没理解错的话,您只想匹配以“Test”开头的行中的数字,而不是任何其他行中的数字。它可能有一个或两个数字,用逗号分隔。如果您想匹配数字并将它们用于某些用途,请使用例如:

str.match(/Test (\d+)(?:, (\d+))?/m);

它匹配字符串“Test”,后跟一组捕获数字,可选地后跟一个由逗号、space 和另一个捕获数字组组成的 non-following 组。

这产生:

const str1 = "Test 12345";
const str2 = "Test 12345, 67891\nSample 0101, 0202";

str1.match(/Test (\d+)(?:, (\d+))?/m);
// -> ['Test 12345', '12345', undefined, index: 0, input: 'Test 12345', groups: undefined]

这是一个包含 3 个元素的数组:第一个元素是完全匹配项,在本例中您不需要它。其余元素是一组或两组匹配的数字。这意味着您可以使用以下方式获得答案:

str1.match(/Test (\d+)(?:, (\d+))?/m).slice(1).filter(Boolean);
// -> ['12345']

同样,对于多行字符串:

str2.match(/Test (\d+)(?:, (\d+))?/m).slice(1).filter(Boolean);
// -> ['12345', '67891']

你也可以先抓取你想要的行,然后取出数字,你甚至可以有更多匹配的行和每行的数字:

"Test 12345, 234, 23, 45\nSample 2, 5, 4\nTest 12"
  .match(/^Test .+$/mg)
  .map(line => line.match(/\d+/g))
  .flat();
// -> ['12345', '234', '23', '45', '12']