Regexp для извлечения двоичного файла из строки

Можно ли иметь строку и извлечь из нее двоичное значение, а также получить только последнюю двоичную цифру из значения:

String = FCW2026P4F6

это будет выводиться в двоичном формате:

01000110 01000011 01010111 00110010 00110000 00110010 00110110 01010000 00110100 01000110 00110110

Теперь мне на самом деле понадобится только последняя двоичная цифра 0. В любом случае это можно сделать с помощью чистого регулярного выражения?

Спасибо.

Еще ничего не пробовал, так как не думаю, что это выполнимо.

Вы пытаетесь преобразовать каждый символ в его значение ASCII, а затем в двоичный? Вы можете использовать регулярное выражение для извлечения FCW2026P4F6 из String = FCW2026P4F6, но для преобразования в двоичный формат вам понадобится другой код.

Barmar 14.09.2023 17:07

@InSync, мудрый человек с востока однажды сказал: «Некоторые люди, столкнувшись с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Присутствующие были поражены и обрадованы, когда мужчина продолжил демонстрировать силу и элегантность этих выражений».

Cary Swoveland 15.09.2023 22:56

@CarySwoveland Что ты имеешь в виду? Я только что говорил OP не пытаться использовать ничего, кроме регулярного выражения, для двоичного преобразования.

InSync 15.09.2023 22:59

@InSync, чтобы некоторые читатели не интерпретировали эту цитату (не читая текст по ссылке) как означающую, что следует избегать использования регулярных выражений, я просто хотел указать, что они имеют свое место. Я не имел в виду, что вы придерживаетесь этого убеждения — вы явно не придерживаетесь этого — хотя некоторые читатели, возможно, ошибочно подумали, что вы придерживаетесь этого мнения, независимо от того, сделал я свой комментарий или нет. Я испытываю величайшее уважение и восхищение вашим вкладом в SO. Между прочим, я разделял ваши намерения, пока не прочитал очень умный ответ Сэма.

Cary Swoveland 15.09.2023 23:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это возможно, но только при определенных условиях. Если у вас есть возможность использовать PCRE2, вы можете использовать такое выражение:

(.*[BDFHJLNPRTVXZ02468]$)|(.*[ACEGIKMOQSUWY13579]$)

и заменить на

${1:+0:1}

Попробуйте здесь: https://regex101.com/r/uYCB86/2

Выражение разделено на две части. В первом — все четные символы, во втором — нечетные. Добавляйте символы по мере необходимости. Они сгруппированы с помощью значка или между ними вот так (ending with even character)|(ending with odd character).
Замена гласит: «Если первая группа соответствует, замените на 0, в противном случае — на 1».

Mandatory message: Don't use regex for this.

Это очень круто! Возможно, вы захотите включить эту ссылку в документацию по этой функции PCRE2, и в этом случае я удалю этот комментарий. Примечание «определенные условия» является расплывчатым. Если вы имеете в виду только возможность использования PCRE2, вам следует просто удалить первое предложение.

Cary Swoveland 15.09.2023 23:02

@CarySwoveland, ссылка добавлена. Спасибо! Есть и другие варианты, допускающие условные замены, хотя и редко.

Sam 16.09.2023 13:19

Хотя это и менее удовлетворительно, чем те, которые используют регулярное выражение для прямого сопоставления строк, если вы добавите "01" к каждой строке, вы сможете сопоставить полученную строку с регулярным выражением.

(?<=[BDFHJLNPRTVXZ02468])0(?=1$)|(?<=[ACEGIKMOQSUWY13579]0)1$

Демо

Это работает со многими языками, включая PHP, Perl, R, Javascript, Python, Ruby и .NET.

Вышеупомянутое регулярное выражение можно разбить следующим образом.

(?<=                     # begin positive lookbehind
  [BDFHJLNPRTVXZ02468]   # match one character in character class
)                        # end positive lookbehind
0                        # match "0"
(?=                      # begin positive lookahead
  1                      # match "1"
  $                      # match end of string
)                        # end positive lookahead
|                        # or
(?<=                     # begin positive lookbehind
  [ACEGIKMOQSUWY13579]   # match one character in character class
  0                      # match "0"
)                        # end positive lookbehind
1                        # match "1"
$                        # assert match is at end of string

Мой ответ был вдохновлен отличным решением @Sam.

Другие вопросы по теме