регулярное выражение - получить различные символы из строки из списка - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь получить отдельные символы из строки, находящейся в списке.

В настоящее время используется шаблон /^[!~]{0,2}/gm, который соответствует первым двум символам, однако, если один и тот же символ появляется дважды встрока, она будет принимать повторяющийся символ вместо поиска другого символа, который появляется в списке. Если !!!~~~test пройдено, совпадение должно быть !~.

Код ниже, кажется, работает, однако я бы предпочел 100% -ное решение регулярных выражений.

$pattern = '/^[!~]{0,2}/';
$matches = [];
$operator = '=';
$value = $origValue;

preg_match($pattern, $origValue, $matches);
$matches = array_filter($matches);

if (count($matches) > 0) {
    $matchesValue = array_shift($matches);
    $matchArr = str_split($matchesValue);
    $matchArr = array_unique($matchArr);
    $matchesValue = implode('', $matchArr);

    ...
}

Обновление: пожалуйстасм. https://regex101.com/r/6lMtfJ/2. Я пытаюсь выбрать либо !, либо ~ один раз в начале строки. Если один и тот же символ появляется более одного раза, он должен игнорировать дубликат и переходить к следующему символу. Больше примеров:

!test     -> !
!!test    -> !
!~test    -> !~
!~~test   -> !~
test!     -> no match
test~~~   -> no match

Есть предложения?

1 Ответ

0 голосов
/ 28 октября 2019
$tests = [
'!test',
'!!test',
'!~test',
'!~~test',
'test!',
'test',
'~!test',
'~~~test',
'!~!~!~test',
];

$pattern = '/^(!~?|~!?)/';
foreach ($tests as $test) {
//~     echo "$test \t=> ";
    if (preg_match($pattern, $test, $m)) {
        $res = $m[0];
    } else {
        $res = "No match";
    }
    printf("%10s => %s\n", $test, $res);
}

Выход:

     !test => !
    !!test => !
    !~test => !~
   !~~test => !~
     test! => No match
      test => No match
    ~!test => ~!
   ~~~test => ~
!~!~!~test => !~
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...