regex — регулярное выражение для извлечения всех @ упомянутых пользовательских данных из строки в переполнении стека

У меня ниже строки. Эта строка содержит данные (@ [ID: username__FULLNAME]) трех упомянутых пользователей. Я хочу извлечь их. Я пробовал приведенный ниже код, но не получил желаемых результатов.

ID is integer type
username and FULLNAME may contain numbers, letter and all kind of special chars.$t = 'Hi @[4232:mark__MΛRK ATTLEY] how are you ?
Hi @[4232:ryan__RYΛN вυηту] how are you ?
Hi @[4232:david__DΛVID शाहिद ] how are you ?
';

Мой код PHP:

$pattern = "|(?:(@\[[0-9]+:[\s\S(?!\])]+\]*))|";
preg_match_all($pattern, $string, $mentionList, PREG_PATTERN_ORDER);
print_r($mentionList);

Текущий результат:

Array
(
[0] => Array
(
[0] => @[4232:mark__MΛRK ATTLEY] how are you ?
Hi @[4232:ryan__RYΛN вυηту] how are you ?
Hi @[4232:david__DΛVID शाहिद] how are you ?

)

[1] => Array
(
[0] => @[4232:mark__MΛRK ATTLEY] how are you ?
Hi @[4232:ryan__RYΛN вυηту] how are you ?
Hi @[4232:david__DΛVID शाहिद] how are you ?

)

)

Ожидаемый результат:

Array
(
[0] => Array
(
[0] => @[4232:mark__MΛRK ATTLEY]
[1] => @[4232:ryan__RYΛN вυηту]
[2] => @[4232:david__DΛVID शाहिद ]
)

)

Может ли кто-нибудь помочь мне получить желаемые результаты?

Благодарю.

0

Решение

Вы можете использовать следующее регулярное выражение: @\[.+\] (демонстрация) который получает все, что у вас есть в [] плюс фронт @,

Проверьте это работает PHP демо

1

Другие решения

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

/@\[(\d+):(\S+)\h+(\S+)\h*\]/

RegEx Demo

RegEx Объяснение:

  • @: Совпадение буквального @
  • \[: Совпадение буквального [
  • (\d+): Сопоставьте цифры 1+ и захватите их в группе № 1 для id
  • :: Совпадение буквального :
  • (\S+): Совпадение 1+ непробельных символов и захватить его в группе № 2 для firstName
  • \h+: Сопоставьте 1 или несколько горизонтальных пробелов
  • (\S+): Совпадение 1+ непробельных символов и захватить его в группе № 3 для lastName
  • \h*: Сопоставьте 0 или более горизонтальных пробелов
  • \]: Совпадение буквального ]
1

Не уверен, что это даст вам именно тот результат, который вы ищете, но ваше регулярное выражение слишком жадное. Вы можете упростить это так: (?:@\[[0-9]+.+?])

Это должно вернуть захваченные группы отдельно.

Не уверен, нужна ли анонимная группа захвата, чтобы ее можно было упростить до (@\[[0-9]+.+?]) или, возможно, даже (@\[.+?]),

1
По вопросам рекламы [email protected]