在不使用 lookbehind 的情况下查找字符串后的一组数字
Find set of numbers after string without using lookbehind
我已经挠头好一阵子了。我正在尝试使用正则表达式在特定字符串之后获取一组数字。我正在使用正向后视,但许多浏览器不支持它。那么有没有办法在不使用 lookbehind 的情况下为此 构建模式?
在下面的示例中,我只想获取字符串 Test 之后的数字,因此它应该只是 12345
和 67891
。这是多行。
字符串 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']
我已经挠头好一阵子了。我正在尝试使用正则表达式在特定字符串之后获取一组数字。我正在使用正向后视,但许多浏览器不支持它。那么有没有办法在不使用 lookbehind 的情况下为此 构建模式?
在下面的示例中,我只想获取字符串 Test 之后的数字,因此它应该只是 12345
和 67891
。这是多行。
字符串 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']