Як визначити даний рядок - це шістнадцятковий кольоровий формат


79

Я шукаю регулярний вираз для перевірки шістнадцяткових кольорів у ASP.NET C #, а
також шукаю код для перевірки на стороні сервера.

Наприклад: #CCCCCC

Відповіді:


167
^#(?:[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, наприклад #91bf4aабо #f13.

Примітка: Однак підтримка шістнадцяткових значень кольору RGBA не підтримується.


1
Я вважав дійсним кольором 3 * 1/2 комбінованого ... так / ^ # (?: [0-9a-fA-F] {1,2}) {3} $ / Здається, обидва способи працюють.
Michael Dausmann

4
@MichaelDausmann: Ні, ваша приймає будь-що від 3 до 6 шістнадцяткових цифр.
Joey

1
@Joey дуже корисний покрокове пояснення. подяка
Карім

Цей регулярний вираз дуже корисний при створенні прикладу програми, яку моя компанія використовує для включення нових розробників. Як програміст старої школи Perl, я був вражений, побачивши, що деякі молодші розробники з'ясували твердження про перспективу в сучасніших мовах програмування. Побачивши той самий регулярний вираз у поданнях кількох інших людей, я нарешті вирішив його загуглити і побачити, що вони щойно придумали, як шукати SO 😅
Вінс,

15

Незначна незгода з іншим рішенням. Я б сказав

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

Причина в тому, що це (правильно) захоплює окремі компоненти RGB. Інший вираз розбив номер # 112233 на три частини, "#" 112 233. Синтаксис насправді "#" (RR GG BB) | (RGB)

Незначним недоліком є ​​необхідність більш зворотного відстеження. При синтаксичному аналізі #CCC ви не знаєте, що другий C є зеленим компонентом, поки ви не потрапите в кінець рядка; при синтаксичному аналізі #CCCCCC ви не знаєте, що друга C все ще є частиною червоного компонента, поки не побачите 4-ю C.


1
Цей регулярний вираз також відповідав би # 1234 та # 12345. Однак може бути лише 3 цифри або 6 цифр. Цей RE дозволяє будь-що від 3 до 6 цифр. Якщо ви справді хотіли зафіксувати правильну структуру, тоді вам довелося б використовувати #([1-9a-fA-F]{3}|[1-9a-fA-F]{6}). Якщо ви хочете зафіксувати окремі кольорові компоненти, він стає більш складним (ваша пропозиція цього теж не робить).
Джої,

Однак для цілей чистої перевірки (тобто чи є значення насправді можливим і правильним) мені легше дивитись на очевидну структуру рядка, а не на вказану. Принаймні в цьому випадку отриманий РЕ є простішим.
Joey

2
@MSalters це все ще не зовсім правильно, оскільки повертає відповідність для останніх 3 цифр #FFFF. Додавання додаткового набору дужок: ^#(([0-9a-fA-F]{2}){3}|([0-9a-fA-F]){3})$це виправлено.
Кріс

Дійсно, |не було поставлено в дужки, тому воно шукало ^#FFFFFFFабо FFF$. Виправлено.
MSalters

не ([0-9a-fA-F]{2}){3}еквівалентно [0-9a-fA-F]{6}?
chharvey

4

Це, якщо ви також хочете прийняти названі кольори та 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

але в HTML підтримується більше кольорів, таких як темно-бірюзовий, світло-золотисто-жовтий тощо
Мендон Ашвіні,

1
@MendonAshwini так. З них 140 нових. Ви можете записати їх у кінці регулярного виразу, розділеного символом |
FrancescoMM

так .. я перевірив чернетки.csswg.org/css-color-4 . Але чи це найкращий спосіб його змінити? Чи надає Java будь-яку бібліотеку?
Мендон Ашвіні,

4

у всіх відповідях згаданий формат RGB, ось регулярний вираз для формату ARGB:

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

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})$

2

Рубін

У Ruby ви маєте доступ до \h(шістнадцяткового) класу символів. Вам також слід більше подбати про закінчення рядків, отже, \A...\zзамість більш загальних^...$

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

Це буде відповідати 3 або 6 шістнадцятковим символам після #. Тож немає RGBA. Він також не враховує регістр, незважаючи на відсутність iпрапора.


1
рубін ви також /\H/які відповідають символом не гекс, так що ви просто повинні заперечувати логічне значення (0 Літери не гекс знайдений регулярним виразом: це дійсно номер гекса) наприклад: !"FF000"[/\H/] # true,!"hello"[/\H/] # false
Алексіс Delahaye

1

Це повинно відповідати будь-якому #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

Це дозволило б групі з 3, а за нею групі з 4, наприклад #1234567, що не є дійсним шестигранним кольором.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.