Можно ли иметь строку и извлечь из нее двоичное значение, а также получить только последнюю двоичную цифру из значения:
String = FCW2026P4F6
это будет выводиться в двоичном формате:
01000110 01000011 01010111 00110010 00110000 00110010 00110110 01010000 00110100 01000110 00110110
Теперь мне на самом деле понадобится только последняя двоичная цифра 0. В любом случае это можно сделать с помощью чистого регулярного выражения?
Спасибо.
Еще ничего не пробовал, так как не думаю, что это выполнимо.
@InSync, мудрый человек с востока однажды сказал: «Некоторые люди, столкнувшись с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Присутствующие были поражены и обрадованы, когда мужчина продолжил демонстрировать силу и элегантность этих выражений».
@CarySwoveland Что ты имеешь в виду? Я только что говорил OP не пытаться использовать ничего, кроме регулярного выражения, для двоичного преобразования.
@InSync, чтобы некоторые читатели не интерпретировали эту цитату (не читая текст по ссылке) как означающую, что следует избегать использования регулярных выражений, я просто хотел указать, что они имеют свое место. Я не имел в виду, что вы придерживаетесь этого убеждения — вы явно не придерживаетесь этого — хотя некоторые читатели, возможно, ошибочно подумали, что вы придерживаетесь этого мнения, независимо от того, сделал я свой комментарий или нет. Я испытываю величайшее уважение и восхищение вашим вкладом в SO. Между прочим, я разделял ваши намерения, пока не прочитал очень умный ответ Сэма.





Это возможно, но только при определенных условиях. Если у вас есть возможность использовать 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, вам следует просто удалить первое предложение.
@CarySwoveland, ссылка добавлена. Спасибо! Есть и другие варианты, допускающие условные замены, хотя и редко.
Хотя это и менее удовлетворительно, чем те, которые используют регулярное выражение для прямого сопоставления строк, если вы добавите "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.
Вы пытаетесь преобразовать каждый символ в его значение ASCII, а затем в двоичный? Вы можете использовать регулярное выражение для извлечения
FCW2026P4F6изString = FCW2026P4F6, но для преобразования в двоичный формат вам понадобится другой код.