質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

4回答

13867閲覧

JSの正規表現で文字列からマイナス記号を含んだ数値を取り出したいが、ハイフンが入った文字列は区別したい

merry

総合スコア13

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2017/06/02 11:28

left:-10.55555px; font-size:30px; top:40px;

JSの正規表現で上記の文字列に対して以下のことをしたいです。

  • マイナス(-)と小数点を含んだ数値のブロックをすべて取り出す
  • マイナスと小数点を含んだ数値でなく、文字列にハイフンを0個以上含んでいる箇所にすべてマッチさせる

2点目は要するに「font-size」をハイフンを含んだひとまとまりとしたいということです。

ためしに作った正規表現では文字列内のハイフンで分割されてしまいうまくいきませんでした。
/[^(-*\d).]+/gi

アイディアある方いればお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

naomi3

2017/06/02 11:39

文字列にハイフンを0個以上含んでいる箇所とは、あらゆる文字、空文字列もその対象になりますが、そういうことですか?
yambejp

2017/06/02 11:46

結果として何を得たいのでしょうか?
gouf

2017/06/02 11:46

対象としている文字列は、CSS のスタイル設定値に見えますが、状況としては、HTML のインライン要素として埋め込まれていたりするのでしょうか
guest

回答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
yambejp

総合スコア114747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

merry

2017/06/02 12:52

ありがとうございました。 詳しいコードまでありがとうございます。 無理に正規表現にこだわらないという意見が参考になりました。
guest

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

think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

merry

2017/06/02 13:19

短時間で複雑なコード例をありがとうございます。 自分の質問方法がわかりづらかったせいで 若干意図と違いましたがループとexecの使用方法が参考になりました!
guest

0

ベストアンサー

  • マイナス(-)と小数点を含んだ数値のブロックをすべて取り出す

正規表現:-?\d+\.?\d*
-? マイナスがついたりつかなかったり
\d+ 数値が1つ以上
.? ピリオドがあったりなかったり
\d* 数値が0つ以上

そこそこ精度が高いです。

  • マイナスと小数点を含んだ数値でなく、文字列にハイフンを0個以上含んでいる箇所にすべてマッチさせる

正規表現:[^(\-*\d)\.]+こちらは、
( 始めカッコ記号
) 終わりカッコ記号
- ハイフン
\d 数値
. ピリオド
以外(^)の1つ以上連続した文字列という意味です。
ハイフンを除いているので、ハイフンが含まれないわけです。

そこまで短縮しようと難しく考えず、単純な実装で構いません。
正規表現:[-a-zA-Z]+
こちらは質問者さんの考えに近いと思いますが、-にもマッチしてしまいます。
正規表現:[a-zA-Z]+(-[a-zA-Z]+)*
こちらはAAAAA-Aにマッチしますが、AAA-にはマッチしません。

投稿2017/06/02 11:53

intelf___

総合スコア868

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

merry

2017/06/02 12:47

詳しくありがとうございます。 >>>マイナスと小数点を含んだ数値でなく、文字列にハイフンを0個以上含んでいる箇所にすべてマッチさせる 手こずっていたこの課題もいただいた正規表現を若干調整させていただいて解決しました。 [a-zA-Z]+(-[a-zA-Z]+)* ↓ [a-zA-Z\s\;\:]+(-[a-zA-Z\s\;\:]+)* 数値部分の取得も完璧でした。
intelf___

2017/06/03 11:51

コメントをしようとして2回投稿しちゃってました うまく動作したようで何よりです。 sublime textやサクラエディタのようにctrl+fで正規表現検索ができると試行がしやすいですよ
merry

2017/06/04 09:49

あれからCSSテキストにtranslate3dなどプロパティに数字が入ってしまうものがあることに気づきましたのでそれに対応するようにさらに手を加えました。 正規表現は使えるとできることが増えますね。 ありがとうございました。
guest

0

上のものは
-?\d+(.\d)?\d*
こちらで数値がピリオドで終わるのを除外できます。

投稿2017/06/02 11:55

intelf___

総合スコア868

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問