Дубликат группы захвата

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

Вот строка: [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?$

Какой у вас вкус/инструмент регулярного выражения?

anubhava 27.08.2024 20:02

Извлеките с помощью [a-zA-Z0-9]{2}.

Wiktor Stribiżew 27.08.2024 20:11

Я использую regex101.com и Java

mgillett 27.08.2024 20:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете использовать это регулярное выражение, чтобы получить все совпадения двух символов между [ и ]:

(?:\[|(?!^)\G\h+)([\dJQKTAdsch]{2})(?=[^]\[]*])

Демо RegEx

Детали регулярного выражения:

  • (?:: Запустить группу без захвата.
    • \[: Сопоставьте [
    • |: ИЛИ
    • (?!^): Убедитесь, что мы не на старте
    • \G: Начало сразу после окончания предыдущего матча.
    • \h+: совпадение 1+ пробелов.
  • ): Завершить группу без захвата.
  • ([\dJQKTAdsch]{2}): сопоставьте 2 символа из заданных разрешенных наборов символов.
  • (?=[^]\[]*]): Утвердить, что перед нами стоит ], прежде чем сопоставить [ или ].

Магия возникает благодаря использованию \G, который представляет собой якорь нулевой ширины, который утверждает позицию в конце предыдущего совпадения.

anubhava 27.08.2024 20:51

Бывают случаи, когда вся строка заключена в скобки [] и содержимое не отображается (внутри более крупной строки). Я пробовал добавлять * после каждой группы, но это не сработало. любые идеи.

mgillett 27.08.2024 21:22

В большинстве случаев строка, которую я анализирую, будет такой: «hughdal:folds». Я хочу зафиксировать имя игрока и действие «фолд». Но иногда игрок сбрасывает карты и показывает свои карты: «MDAISY57: сбрасывает [Ах]». Я хочу запечатлеть его имя, действие и карты. Он может показать одну карту, две, вплоть до всех пяти.

mgillett 27.08.2024 22:40

на самом деле это фолд или чек. Карты отображаются только в сложенном виде. Вот что я пробовал, но это не совсем сработало: (.*?)\s?:\s?(\bfolds\b|\bchecks\b)(?:[|(?!^)\G\h+ )*([\dJ‌​QKTAdsch]{2})*(?=[^]‌​[]*])*\s?$

mgillett 28.08.2024 05:23

Вот все возможные строки для регулярного выражения: "mddgfc: проверяет" "Tomi1981: складки" "DJPOPS613: складки [Ad]" "DJPOPS613: складки [Qh Qc]" "SchuDani: складки [2c As Ts]" "anshovel: складки [Ad 5d 4h 8h]" "pokerpummi: фолд [2c 5h Ac 6d 7s]" (Извините, я не смог понять, как составить список.)

mgillett 28.08.2024 05:37

Я не могу прочитать эти значения из комментария. Нажмите ссылку «Изменить» под вашим вопросом и предоставьте эти примеры. Также добавьте ожидаемые совпадения для каждого случая.

anubhava 28.08.2024 06:30

Посмотрите мое новое демо с вашими примерами

anubhava 28.08.2024 14:21

Я поигрался с ним и придумал что-то вроде этого, из-за необязательных частей все еще есть пустые совпадения. regex101.com/r/6Ku2yD/1

The fourth bird 28.08.2024 14:40

Отлично, этот определенно лучше @Thefourthbird

anubhava 28.08.2024 16:44

Это просто для развлечения, я ничего публиковать не буду. Вы можете использовать его или улучшить, поскольку вы мастер :-)

The fourth bird 28.08.2024 17:15

@Thefourthbird: Спасибо. Не стесняйтесь публиковать это как ответ, хотя я думаю, что ОП не понял бы, что потребуется такая большая сложность :-)

anubhava 28.08.2024 17:24

Да, ты прав. Мне понадобится некоторое время, чтобы это понять, но я ценю вклад каждого. Определенно регулярное выражение следующего уровня.

mgillett 28.08.2024 18:38

1-й вопрос: есть 1-я группа без захвата, но она фиксирует вещи внутри нее - я этого не понимаю? Это означает, что вы можете захватывать объекты внутри группы, не предназначенной для захвата?

mgillett 28.08.2024 19:02

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

Regex – как сопоставить строку между двумя необязательными символами, которые не включены в группу?
Регулярное выражение для строки буквенно-цифровых кодов (МКБ-10) независимо от того, есть ли у нее точка в середине или нет
SQL, чтобы определить, является ли строка числовыми символами, за которыми следуют буквенные символы
Как изменить нижний регистр на верхний регистр при нескольких вариантах выбора в режиме регулярного выражения
String#gsub, как использовать совпадение в атрибуте replace, а также вставлять линию разрыва
Bash-скрипт для сокращения имени файла до длины не более n, но без обрезки целых слов
Как извлечь часть строки с помощью sed?
Как использовать регулярное выражение для извлечения набора определенных подстрок?
Негативный просмотр, похоже, не работает должным образом
Объединить многострочные строки в фрейме данных pandas на основе шаблона регулярного выражения