Как мы проверяем формат CSR с помощью Regex

В настоящее время я пытаюсь проверить формат CSR с помощью регулярного выражения javascript, и в настоящее время я застрял с этим регулярным выражением:

^ (-----BEGIN NEW CERTIFICATE REQUEST-----)(.*[\r\ n]) + (-----END NEW CERTIFICATE REQUEST-----) $

Что я хочу сделать, так это то, что мне нужно проверить только 1-е появление

-----BEGIN NEW CERTIFICATE REQUEST----- 

и

-----END NEW CERTIFICATE REQUEST----- 

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

Это также должно быть недействительным:

    -----BEGIN NEW CERTIFICATE REQUEST-----
test
test
test
test
    -----END NEW CERTIFICATE REQUEST-----
    -----BEGIN NEW CERTIFICATE REQUEST-----
test
test
test
test
    -----END NEW CERTIFICATE REQUEST-----

должно быть только:

    -----BEGIN NEW CERTIFICATE REQUEST-----
test
test
test
test
    -----END NEW CERTIFICATE REQUEST-----

Похоже, мне тоже трудно понять это через RegEx


person EdgyIT    schedule 19.05.2015    source источник


Ответы (3)


Вы можете использовать эту версию регулярного выражения, которая захватит только первый блок START/END только в том случае, если это уникальный блок такого типа:

^(?:(?!-{3,}(?:BEGIN|END) NEW CERTIFICATE REQUEST)[\s\S])*(-{3,}BEGIN NEW CERTIFICATE REQUEST(?:(?!-{3,}END NEW CERTIFICATE REQUEST)[\s\S])*?-{3,}END NEW CERTIFICATE REQUEST-{3,})(?![\s\S]*?-{3,}BEGIN NEW CERTIFICATE REQUEST[\s\S]+?-{3,}END NEW CERTIFICATE REQUEST[\s\S]*?$)

См. демонстрацию.

ИЗМЕНИТЬ:

Чтобы убедиться, что мы просто совпадаем в конце, с необязательными пробелами, вы можете использовать более короткое регулярное выражение:

^(?:(?!-{3,}(?:BEGIN|END) NEW CERTIFICATE REQUEST)[\s\S])*(-{3,}BEGIN NEW CERTIFICATE REQUEST(?:(?!-{3,}BEGIN NEW CERTIFICATE REQUEST)[\s\S])*?-{3,}END NEW CERTIFICATE REQUEST-{3,})\s*$

См. демонстрацию 2.

person Wiktor Stribiżew    schedule 19.05.2015
comment
Я также проверил это, и я думаю, что это также дает такие же результаты - я думаю, что мне нужно обновить свой вопрос, хотя - регулярное выражение также должно быть недействительным, если оно повторяет теги BEGIN и END - person EdgyIT; 19.05.2015
comment
@MarkBautista: Пожалуйста, проверьте другое обновление. Если это сработает для вас, я предоставлю более подробное объяснение используемого регулярного выражения. Кроме того, не стесняйтесь разветвлять мою демонстрацию на regex101 с вашими примерами. - person Wiktor Stribiżew; 19.05.2015
comment
фантастический! Крутой ответ! я сделал некоторые незначительные изменения, поскольку я понимаю, что это должно быть «НАЧАТЬ ЗАПРОС СЕРТИФИКАТА» / «КОНЕЦ ЗАПРОСА СЕРТИФИКАТА» (без «НОВОГО») - person EdgyIT; 20.05.2015

Попробуйте с этим регулярным выражением:

^(?:\s|\R)*(?:-----BEGIN NEW CERTIFICATE REQUEST-----)(?<request>(?:.*\R)+)(?:-----END NEW CERTIFICATE REQUEST-----)(?:\s|\R)*$

протестируйте здесь

person T'lash    schedule 19.05.2015
comment
Я также проверил это, и я думаю, что это также дает такие же результаты - я думаю, что мне нужно обновить свой вопрос, хотя - регулярное выражение также должно быть недействительным, если оно повторяет теги BEGIN и END - person EdgyIT; 19.05.2015

Хотя проверка RegEx полезна, было бы лучше попытаться декодировать сертификат.

Вот пример того, как это сделать:

https://pkijs.org/examples/PKCS10_complex_example.html

person rmhrisk    schedule 09.12.2016