どうですか:
// returns array: ["0px", "3px", "2px"]
"margin: 0px 3px 2px;".match(/\d+(?:px|em)?/g)
(グローバル)フラグを使用g
して、最初の一致で停止するのではなく、文字列全体と一致させます。
// other example - returns array: ["3em", "2px", "39"]
"margin: 3em 2px 39;".match(/\d+(?:px|em)?/g)
これがどのように機能するかをさらに明確にするには:
\d+
数字と一致します(互いに続く1つ以上)
(?:px|em)?
このグループのキャプチャをスキップします(ただし、一致します)-pxまたはem文字列を検索します。最後の疑問符は、このグループ全体が見つからない可能性があることを意味します(単位のない数字がある場合)。
編集:以下のコメントからOPの懸念に答えるため。
これを行う:2つの理由でnew RegExp(/\d+(?:px|em)?/g).exex(mystring)
機能しません。まず、別の正規表現から新しい正規表現を作成するときにフラグ()を指定することはできません(g
ここで/\d+(?:px|em)?/g
はこれが当てはまります)は、と同じように、正規表現オブジェクト[]
と同等ですnew Array()
。構文を使用して正規表現オブジェクトを作成する正しい方法は、new RegExp
2つの文字列引数を渡すことです。はパターン、2番目はフラグです。したがって、上記はnew RegExp('\d+(?:px|em)?', 'g')
次のようになります。2つ目は、.exec()
メソッドが常に最初の一致(すべてではない)を返すため、目的のオブジェクトに対しては機能しないということです。
したがって、スクリプト内のいくつかの場所でその正規表現を再利用するには、それを変数に割り当ててから、.match()
関数に渡す必要があります。次のようになります。
var reg = new RegExp('\d+(?:px|em)?', 'g');
// somewhere down the road...
mystring.match(reg);
// and on some other string...
myotherstring.match(reg);