developer tip

주어진 문자열을 식별하는 방법은 16 진수 색상 형식입니다.

copycodes 2020. 11. 13. 23:42
반응형

주어진 문자열을 식별하는 방법은 16 진수 색상 형식입니다.


ASP.NET C #에서 16 진수 색상의 유효성을 검사하는 정규식
을 찾고 있으며 서버 측에서 유효성 검사를위한 코드도 찾고 있습니다.

예를 들면 : #CCCCCC


^#(?:[0-9a-fA-F]{3}){1,2}$

해부:

^              anchor for start of string
#              the literal #
(              start of group
 ?:            indicate a non-capturing group that doesn't generate backreferences
 [0-9a-fA-F]   hexadecimal digit
 {3}           three times
)              end of group
{1,2}          repeat either once or twice
$              anchor for end of string

이는 CSS에서 사용할 수있는 임의의 16 진수 색상 값 (예 : #91bf4a또는 )과 일치합니다 #f13.

참고 : RGBA 16 진수 색상 값은 지원하지 않습니다.


다른 솔루션에 약간의 불일치가 있습니다. 나는 말할 것이다

^#(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$

그 이유는 이것이 (올바르게) 개별 RGB 구성 요소를 캡처하기 때문입니다. 다른 표현식은 '#'112233의 세 부분에서 # 112233을 분리했습니다. 구문은 실제로 '#'(RR GG BB) | (RGB)

약간의 단점은 더 많은 역 추적이 필요하다는 것입니다. #CCC를 구문 분석 할 때 두 번째 C가 문자열의 끝을 찾을 때까지 녹색 구성 요소라는 것을 알 수 없습니다. #CCCCCC를 구문 분석 할 때 두 번째 C가 4 번째 C를 볼 때까지 여전히 빨간색 구성 요소의 일부라는 것을 알 수 없습니다.


이름이 지정된 색상과 rgb (a, b, c)도 허용하려는 경우입니다. 마지막 "i"는 대소 문자를 구분하지 않습니다.

HTML 색상 (# 123, rgb는 허용되지 않음)

/^(#[a-f0-9]{6}|black|green|silver|gray|olive|white|yellow|maroon|navy|red|blue|purple|teal|fuchsia|aqua)$/i

CSS 색상 (# 123, rgb 허용)

/^(#[a-f0-9]{6}|#[a-f0-9]{3}|rgb *\( *[0-9]{1,3}%? *, *[0-9]{1,3}%? *, *[0-9]{1,3}%? *\)|rgba *\( *[0-9]{1,3}%? *, *[0-9]{1,3}%? *, *[0-9]{1,3}%? *, *[0-9]{1,3}%? *\)|black|green|silver|gray|olive|white|yellow|maroon|navy|red|blue|purple|teal|fuchsia|aqua)$/i

모든 답변은 RGB 형식을 언급했으며 ARGB 형식에 대한 정규식은 다음과 같습니다.

^#[0-9a-fA-F]{8}$|#[0-9a-fA-F]{6}$|#[0-9a-fA-F]{4}$|#[0-9a-fA-F]{3}$

MSalters의 답변을 기반으로하지만 잘못된 일치를 방지하면 다음과 같이 작동합니다.

^#(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$

또는 선택적 해시 #기호의 경우 :

^#?(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$

역 참조가 생성되지 않고 :

^#?(?:(?:[0-9a-fA-F]{2}){3}|(?:[0-9a-fA-F]){3})$

이것은 어떤 일치해야합니다 #rgb, #rgba, #rrggbb, 및 #rrggbbaa구문 :

/^#(?:(?:[\da-f]{3}){1,2}|(?:[\da-f]{4}){1,2})$/i

분해 :

^            // start of line
#            // literal pound sign, followed by
(?:          // either:
  (?:          // a non-capturing group of:
    [\da-f]{3}   // exactly 3 of: a single digit or a letter 'a'–'f'
  ){1,2}       // repeated exactly 1 or 2 times
|            // or:
  (?:          // a non-capturing group of:
    [\da-f]{4}   // exactly 4 of: a single digit or a letter 'a'–'f'
  ){1,2}       // repeated exactly 1 or 2 times
)
$            // end of line
i            // ignore case (let 'A'–'F' match 'a'–'f')

위의 구문은이 구문과 동일 하지 않으며 올바르지 않습니다.

/^#(?:[\da-f]{3,4}){1,2}$/i

이렇게 #1234567하면 유효한 16 진수 색상이 아닌 과 같이 3 인 그룹과 4 인 그룹이 차례로 허용 됩니다.


루비

Ruby에서는 \h(16 진수) 문자 클래스에 액세스 할 수 있습니다 . 또한 줄 끝을 더 잘 관리해야하므로 \A...\z더 일반적인^...$

/\A#(\h{3}){1,2}\z/

이것은 # 다음에 나오는 3 개 또는 6 개의 16 진수 문자와 일치합니다. 따라서 RGBA가 없습니다. i플래그가 없더라도 대소 문자를 구분하지 않습니다 .

참고 URL : https://stackoverflow.com/questions/1636350/how-to-identify-a-given-string-is-hex-color-format

반응형