正则表达式-从列表中的字符串中获取不同的字符

时间:2019-10-28 14:58:09

标签: php regex

我正在尝试从列表中的字符串中获取不同的字符。

当前,模式为/^[!~]{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 :(得分:0)

$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 => !~