preg_match_all JS equivalent?
Asked Answered
H

5

19

Is there an equivalent of PHP's preg_match_all in Javascript? If not, what would be the best way to get all matches of a regular expression into an array? I'm willing to use any JS library to make it easier.

Hinckley answered 11/6, 2009 at 21:25 Comment(0)
T
33

You can use match with the global modifier:

>>> '1 2 3 4'.match(/\d/g);
["1", "2", "3", "4"]
Trochaic answered 11/6, 2009 at 21:26 Comment(4)
I didn't understand that syntax.Christachristabel
@erm3nda i think /\d/g is you didn't understand. Here Creating a regular expression in Javascript.Iolenta
Note that this approach ignores captures. '1a 2b 3c 4d'.match(/(\d)([a-z])/g) outputs just ["1a", "2b", "3c", "4d"]. If you need captures see this answerFaller
If you need captures, matchAll fits much better. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Coussoule
P
10

John Resig has written about a great technique on his blog called 'Search and dont replace'

It works using javascript's replace function, which takes a callback function, and returns nothing to leave the original content unaltered.

This can be a neater than using a global match and iterating over an array of results, especially if you're capturing several groups.

Presidency answered 11/6, 2009 at 21:30 Comment(0)
F
3

A better equivalent of preg_match_all from PHP in JS would be to use the exec() function. This will allow you to capture groups as well, with match() you can not do that.

For example you want to capture all times and the number in brackets from the variable myString:

var myString = "10:30 am (15 left)11:00 am (15 left)11:30 am";
var pattern = /(\d{1,2}:\d{1,2}\s?[ap]m)\s\((\d+)/gi;
var match;
while (match = pattern.exec(myString)){
  console.log('Match: "' + match[0] + '" first group: -> "' + match[1] + '" second group -> ' + match[2]);
}

The output will be:

Match: "10:30 am (15" first group: -> "10:30 am" second group -> 15
Match: "11:00 am (15" first group: -> "11:00 am" second group -> 15
Foxtail answered 27/5, 2016 at 10:36 Comment(0)
C
2

If you need the exactly return structure as in php. Please check for yourself before usage)

Solution (on typescript):

function preg_match_all(regex: RegExp, str: string) {
  return [...str.matchAll(new RegExp(regex, 'g'))].reduce((acc, group) => {
    group.filter((element) => typeof element === 'string').forEach((element, i) => {
      if (!acc[i]) acc[i] = [];
      acc[i].push(element);
    });

    return acc;
  }, [] as string[][]);
}

Example (on javascript):

const str = ';9N;N1;CP-S2;EU;CP-S3;E;CP-S4;KRT;VH;;VL;CP-S2;CP-S3;CP-S4';
const regex = /CP-(S[\d*])/;
const result = preg_match_all(regex, str);

console.log(result);

function preg_match_all(regex, str) {
  return [...str.matchAll(new RegExp(regex, 'g'))].reduce((acc, group) => {
    group.filter((element) => typeof element === 'string').forEach((element, i) => {
      if (!acc[i]) acc[i] = [];
      acc[i].push(element);
    });

    return acc;
  }, []);
}
Cw answered 17/12, 2021 at 5:5 Comment(0)
R
0

Use new RegExp().test()

function preg_match_all(regex, str) {
  return new RegExp(regex,'g').test(str)
}
Russell answered 7/6, 2020 at 22:21 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.