Я искал это, но не смог заставить его работать, поэтому я буду использовать конкретный пример.
Вот строка: [Ah 4d 6s]
Я хочу захватить каждую карту: Ah
, 4d
и 6s
. Загвоздка в том, что может присутствовать разное количество карт: 1, 2, 3, 4 или 5. Вся строка также может отсутствовать.
Я могу заставить его работать, когда [] нет в строке. Пространства доставляют мне проблемы.
Вот что я пробовал:
\[([\dJQKTAdsch]{2}){1,}\]?,
но я получаю сообщение «Повторяющаяся группа захвата будет захватывать только последнюю итерацию. Поместите группу захвата вокруг повторяющейся группы, чтобы захватить все итерации, или вместо этого используйте группу без захвата, если вас не интересуют данные».
Вот все возможности:
mddgfc: checks
Tomi1981: folds
DJPOPS613: folds [Ad]
DJPOPS613: folds [Qh Qc]
SchuDani: folds [2c As Ts]
anshovel: folds [Ad 5d 4h 8h]
pokerpummi: folds [2c 5h Ac 6d 7s]
I expect to parse out : <player name>: <action> <hole cards>
The <hole cards> may or may not be present and are enclosed in square
brackets : [<card1> <card2> ...]
Here is the latest regex I tried :
(.*?)\s?:\s?(\bfolds\b|\bchecks\b)(?:[|(?!^)\G\h+)*([\dJQKTAdsch]{2})*(?=[^][]*])*\s?$
Извлеките с помощью [a-zA-Z0-9]{2}
.
Я использую regex101.com и Java
Вы можете использовать это регулярное выражение, чтобы получить все совпадения двух символов между [
и ]
:
(?:\[|(?!^)\G\h+)([\dJQKTAdsch]{2})(?=[^]\[]*])
Детали регулярного выражения:
(?:
: Запустить группу без захвата.
\[
: Сопоставьте [
|
: ИЛИ(?!^)
: Убедитесь, что мы не на старте\G
: Начало сразу после окончания предыдущего матча.\h+
: совпадение 1+ пробелов.)
: Завершить группу без захвата.([\dJQKTAdsch]{2})
: сопоставьте 2 символа из заданных разрешенных наборов символов.(?=[^]\[]*])
: Утвердить, что перед нами стоит ]
, прежде чем сопоставить [
или ]
.Магия возникает благодаря использованию \G
, который представляет собой якорь нулевой ширины, который утверждает позицию в конце предыдущего совпадения.
Бывают случаи, когда вся строка заключена в скобки [] и содержимое не отображается (внутри более крупной строки). Я пробовал добавлять * после каждой группы, но это не сработало. любые идеи.
В большинстве случаев строка, которую я анализирую, будет такой: «hughdal:folds». Я хочу зафиксировать имя игрока и действие «фолд». Но иногда игрок сбрасывает карты и показывает свои карты: «MDAISY57: сбрасывает [Ах]». Я хочу запечатлеть его имя, действие и карты. Он может показать одну карту, две, вплоть до всех пяти.
на самом деле это фолд или чек. Карты отображаются только в сложенном виде. Вот что я пробовал, но это не совсем сработало: (.*?)\s?:\s?(\bfolds\b|\bchecks\b)(?:[|(?!^)\G\h+ )*([\dJQKTAdsch]{2})*(?=[^][]*])*\s?$
Вот все возможные строки для регулярного выражения: "mddgfc: проверяет" "Tomi1981: складки" "DJPOPS613: складки [Ad]" "DJPOPS613: складки [Qh Qc]" "SchuDani: складки [2c As Ts]" "anshovel: складки [Ad 5d 4h 8h]" "pokerpummi: фолд [2c 5h Ac 6d 7s]" (Извините, я не смог понять, как составить список.)
Я не могу прочитать эти значения из комментария. Нажмите ссылку «Изменить» под вашим вопросом и предоставьте эти примеры. Также добавьте ожидаемые совпадения для каждого случая.
Посмотрите мое новое демо с вашими примерами
Я поигрался с ним и придумал что-то вроде этого, из-за необязательных частей все еще есть пустые совпадения. regex101.com/r/6Ku2yD/1
Отлично, этот определенно лучше @Thefourthbird
Это просто для развлечения, я ничего публиковать не буду. Вы можете использовать его или улучшить, поскольку вы мастер :-)
@Thefourthbird: Спасибо. Не стесняйтесь публиковать это как ответ, хотя я думаю, что ОП не понял бы, что потребуется такая большая сложность :-)
Да, ты прав. Мне понадобится некоторое время, чтобы это понять, но я ценю вклад каждого. Определенно регулярное выражение следующего уровня.
1-й вопрос: есть 1-я группа без захвата, но она фиксирует вещи внутри нее - я этого не понимаю? Это означает, что вы можете захватывать объекты внутри группы, не предназначенной для захвата?
Какой у вас вкус/инструмент регулярного выражения?