Regex: возвращает другой порядок совпадений в одной группе захвата - PullRequest
1 голос
/ 17 мая 2019

Я пытаюсь извлечь удостоверения пользователя из смарт-карты, и мне нужно сопоставить этот шаблон: CN=LAST.FIRST.MIDDLE.0000000000

И получить этот результат: FIRST.LAST

Обычно это будет легкоесли бы я делал это в своем собственном коде:

# python example
string = 'CN=LAST.FIRST.MIDDLE.000000000'
pattern = 'CN=(\w+)\.(\w+)\.'
match = regex.search(pattern, string)

parsedResult = match.groups()[1] + '.' + match.groups()[0]

К сожалению, я сопоставляю шаблон с использованием Keycloaks X.509 веб-формы certmap .Я ограничен использованием только одного регулярного выражения, и оно может содержать только одну группу захвата.Это HTML-форма, поэтому здесь не используется фактический код, а только одно регулярное выражение.

Кажется, что мне нужно иметь группы подхватов и сначала вернуть вторую сопоставленную группу, а затем первуюподходящая группа, все в основной группе захвата.Возможно ли что-то подобное сделать?

Кроме того, я предполагаю, что мы ограничены теми функциями, которые поддерживаются Java, потому что это то, на чем работает приложение.

Ответы [ 2 ]

3 голосов
/ 17 мая 2019

Я не думаю, что это возможно только с одной группой захвата. Если я правильно прочитал документацию о keycloak, группа захвата фактически является результатом регулярного выражения. Таким образом, вы можете сопоставить FIRST или LAST или оба в исходном порядке, но не изменить порядок.

0 голосов
/ 17 мая 2019

Да, это возможно.Это выражение может помочь вам сделать это:

CN=([A-Z]+)\.(([A-Z]+)+)\.([A-Z]+)\.([0-9]+)

Демо

enter image description here

RegEx

Если это не было вашим желаемым выражением, вы можете изменить / изменить выражение в regex101.com .Например, вы добавляете уменьшить границы выражения и значительно упрощаете его, если хотите.Например, это также будет работать:

CN=(\w+)\.(\w+)(.*) 

RegEx Circuit

Вы также можете визуализировать свои выражения в jex.im :

enter image description here

Python Test

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"CN=([A-Z]+)\.(([A-Z]+)+)\.([A-Z]+)\.([0-9]+)"

test_str = "CN=LAST.FIRST.MIDDLE.000000000"

subst = "\\2\\.\\1"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

JavaScript Demo

const regex = /CN=([A-Z]+)\.(([A-Z]+)+)\.([A-Z]+)\.([0-9]+)/gm;
const str = `CN=LAST.FIRST.MIDDLE.000000000`;
const subst = `$2\.$1`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...