left:-10.55555px; font-size:30px; top:40px;
JSの正規表現で上記の文字列に対して以下のことをしたいです。
- マイナス(-)と小数点を含んだ数値のブロックをすべて取り出す
- マイナスと小数点を含んだ数値でなく、文字列にハイフンを0個以上含んでいる箇所にすべてマッチさせる
2点目は要するに「font-size」をハイフンを含んだひとまとまりとしたいということです。
ためしに作った正規表現では文字列内のハイフンで分割されてしまいうまくいきませんでした。
/[^(-*\d).]+/gi
アイディアある方いればお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
正規表現へこだわりがなければ、「;」で分割した後「:」で再分割して
値の部分だけチェックすればよいような気がしますけどね
sample
javascript
1var str="left:-10.55555px; font-size:30px; top:40px; right:-40px; margin-right:1.5px; "; 2var a=str.replace(/^\s+|;?\s*$/,'').split(/\s*;\s*/); 3b=a.filter(function(i,j){ 4 return !i.split(":")[1].match(/-\d|\d\.\d/); 5}); 6console.log(b.join("; "));
投稿2017/06/02 11:58
編集2017/06/02 12:13総合スコア117674
0
簡易版コード
質問文にある文字列ならば下記正規表現で可能ですが、簡易コード故に複数の数値が指定された場合に対応できません。
JavaScript
1var string = 'left:-10.55555px; font-size:30px; top:40px; margin: -10em -1em 3em 2em;'; 2var lengthList = string.match(/-(?:\d+|\d*\.\d+)[a-z]+(?=\s*(?:;|$))/g); 3 4console.log(lengthList); // ["-10.55555px"]
正攻法なコード
既に指摘されている通り、CSSのプロパティ名/プロパティ値でパースしてから、プロパティ値から負の数値を複数抽出可能です。
下記コードは CSS 2.2 の Syntax (構文) を元に書いたコードです。
全てのSyntaxを考慮していない簡易版ですが、先の簡易コードよりはマシです。
より洗練されたコードにする為には仕様書にある構文を読んで修正して下さい。
JavaScript
1function parseDeclarationList (declarationListString) { 2 var reg = /(-?[_a-z][_a-z\d]*(?:-[_a-z][_a-z\d]*)*)\s*:\s*([^;]+)/g, 3 declarationList = [], 4 declaration; 5 6 while (declaration = reg.exec(declarationListString)) { 7 declarationList.push([declaration[1], declaration[2]]) 8 } 9 10 return declarationList; 11} 12 13function findMinusValues (declarationListString) { 14 var valueList = []; 15 16 for (var i = 0, declarationList = parseDeclarationList(declarationListString), len = declarationList.length, reg = /-(?:\d+|\d*\.\d+)[a-z]+/g, value; i < len; ++i) { 17 18 if (value = reg.exec(declarationList[i][1])){ 19 valueList.push(value[0]); 20 } 21 } 22 23 return valueList; 24} 25 26var string = 'left:-10.55555px; font-size:30px; top:40px; margin: -10em -1em 3em 2em;'; 27console.log(findMinusValues(string)); // ["-10.55555px", "-10em"]
Re: merry さん
投稿2017/06/02 12:51
総合スコア18194
0
ベストアンサー
- マイナス(-)と小数点を含んだ数値のブロックをすべて取り出す
正規表現:-?\d+\.?\d*
-? マイナスがついたりつかなかったり
\d+ 数値が1つ以上
.? ピリオドがあったりなかったり
\d* 数値が0つ以上
そこそこ精度が高いです。
- マイナスと小数点を含んだ数値でなく、文字列にハイフンを0個以上含んでいる箇所にすべてマッチさせる
正規表現:[^(\-*\d)\.]+
こちらは、
( 始めカッコ記号
) 終わりカッコ記号
- ハイフン
\d 数値
. ピリオド
以外(^)の1つ以上連続した文字列という意味です。
ハイフンを除いているので、ハイフンが含まれないわけです。
そこまで短縮しようと難しく考えず、単純な実装で構いません。
正規表現:[-a-zA-Z]+
こちらは質問者さんの考えに近いと思いますが、-
にもマッチしてしまいます。
正規表現:[a-zA-Z]+(-[a-zA-Z]+)*
こちらはAAA
やAA-A
にマッチしますが、AAA-
にはマッチしません。
投稿2017/06/02 11:53
総合スコア868
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。