0

特定のパターンの文字列内のすべての出現に一致する正規表現が必要です。

\d+

私の文字列は CSS ルールなので、プロパティで始まり、セミコロンで終わる必要があることがわかっています。真ん中にあるものを手に入れたい。

たとえば、文字列では次のようになります。

margin: 0px 3px 2px;

私は取得したい:

0px 3px 2px

私は次のようなことを試みています:

margin:\s*?(\d+)px

ただし、最初のみに一致します。次に、数字の後に2文字(em | px)、1文字(%)、またはまったくないことができると言う方法がわかりません。

正規表現の第一人者は私を助けることができますか?

新しい質問を開くことを好みましたが、この投稿は以前の投稿に関連しています: CSS 正規表現

4

3 に答える 3

1

どうですか:

// 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 RegExp2つの文字列引数を渡すことです。はパターン、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);
于 2012-12-10T13:44:36.530 に答える
0

私はあなたの代わりにmargin:\s*?(\d+)px試してみるべきだと思いますmargin:.*?;

後ろの参照で何かのような

margin:(.*?);

于 2012-12-10T13:44:30.330 に答える
0

多分あなたはこれが必要です:

var re = /^\w+:(.+);$/;
var st = "margin: 0px 3px 3px;";
re.exec(st);

またはRegex Testerでそれをいじります。将来の使用のためにウェブサイトをお気に入りに保存してください

于 2012-12-10T13:46:31.323 に答える