6

この種の文字列の正規表現を探しています

rgb(r,g,b)
rgba(r,g,b,a)
hsl(h,s%,l%)
hsla(h,s%,l%,a)

と:

r,g,b integer included between 0 and 255, 
a float between 0 and 1 (truncated to first digit after the point)
h integer included between 0 and 359
s,l integer included between 0 and 100

RGBの場合、私はそれらの正規表現を書きました:

rgb\(\s*((?:[0-2]?[0-9])?[0-9])\s*,\s*((?:[0-2]?[0-9])?[0-9])\s*,\s*((?:[0-2]?[0-9])?[0-9])\s*\)$

動作しますが、rgb(299,299,299) のような文字列も許可します。より効果的にするにはどうすればよいですか?rgba、hsl、hslaはどうですか?ありがとう

4

3 に答える 3

7

最後に、これらの正規表現を書きました:

    String keywords_color_regex = "^[a-z]*$";
    String hex_color_regex = "^#[0-9a-f]{3}([0-9a-f]{3})?$";
    String rgb_color_regex = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%?\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%?\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%?\\s*\\)$";
    String rgba_color_regex = "^rgba\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%?\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%?\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])%?\\s*,\\s*((0.[1-9])|[01])\\s*\\)$";
    String hsl_color_regex = "^hsl\\(\\s*(0|[1-9]\\d?|[12]\\d\\d|3[0-5]\\d)\\s*,\\s*((0|[1-9]\\d?|100)%)\\s*,\\s*((0|[1-9]\\d?|100)%)\\s*\\)$";

私は個人的に使用するライブラリを開発しているので、正規表現を使用することを好みます。コードを完全にコメントしました。ヒントをありがとう!

于 2012-09-17T10:20:05.390 に答える
6

解決策が 2 つあります。また :

1.入力から数値を抽出し、if条件で確認します

a) 正規表現

rgb\(\s*(?:(\d{1,3})\s*,?){3}\)

b) 視覚的な説明

RGB 値を解析するための単純な正規表現

2. (かなり複雑な) 正規表現を構築して、入力を直接チェックする

a) 正規表現

rgb\(\s*(?:(?:\d{1,2}|1\d\d|2(?:[0-4]\d|5[0-5]))\s*, ?){3}\)$

rdb(0,0,255) => OK
rdb(104,10,299) => KO
rdb(299,5,299) => KO

b) 視覚的な説明

RGB 値を解析するためのより堅牢な正規表現


チップ :

  • 0 から 359 までの整数を使用できる正規表現

    \d{1,2}|[1-2]\d{2}|3[0-5]\d

  • 0 から 100 までの整数を使用できる正規表現

    \d{1,2}|100

結論

一般的な経験則として、コードの保守性については、ソリューション #1 をお勧めします。正規表現に関与していない開発者は、何が起こっているのかすぐに理解できます。コードを完全にコメントすることを忘れないでください。

解決策 2 を好む場合は、正規表現が複雑であるため、正規表現のバックグラウンドが豊富な開発者を用意してください。

于 2012-09-13T12:30:09.697 に答える
2

16 進数

/[\#]([a-fA-F\d]{6}|[a-fA-F\d]{3})/gm

RGB

/[Rr][Gg][Bb][\(](((([\d]{1,3})[\,]{0,1})[\s]*){3})[\)]/gm

RGBA

/[Rr][Gg][Bb][Aa][\(](((([\d]{1,3}|[\d\.]{1,3})[\,]{0,1})[\s]*){4})[\)]/gm

HSL

/[Hh][Ss][Ll][\(](((([\d]{1,3}|[\d\%]{2,4})[\,]{0,1})[\s]*){3})[\)]/gm

HSLA

/[Hh][Ss][Ll][Aa][\(](((([\d]{1,3}|[\d\%]{2,4}|[\d\.]{1,3})[\,]{0,1})[\s]*){4})[\)]/gm
于 2016-05-22T10:01:29.750 に答える