选择在字符串中仅出现一次的字符

Let*_*Pie 5 regex

是否可以选择仅出现一次的角色?

我熟悉负面的后视,并尝试了以下内容

/(.)(?<!\1.*)/

但无法让它发挥作用.

例子:

given AXXDBD it should output ADBD
       ^^ - this is unacceptable
given 123558 it should output 1238
         ^^ - this is unacceptable
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助

iai*_*inn 5

可能有很多方法,但我认为你正在寻找类似的东西

(.)\1{1,}
Run Code Online (Sandbox Code Playgroud)

也就是说,任何字符后跟同一个字符至少一次.

你的问题用PHP和JS标记,所以:

PHP:

$str = preg_replace('/(.)\1{1,}/', '', $str);
Run Code Online (Sandbox Code Playgroud)

JS:

str = str.replace(/(.)\1{1,}/g, '');
Run Code Online (Sandbox Code Playgroud)

  • 你可以使用`+`而不是`{1,}` (3认同)

Aym*_*Dev 5

不使用正则表达式:

function not_twice ($str) {
    $str = (string)$str;
    $new_str = '';
    $prev = false;

    for ($i=0; $i < strlen($str); $i++) {
        if ($str[$i] !== $prev) {
            $new_str .= $str[$i];
        }
        $prev = $str[$i];
    }
    return $new_str;
}
Run Code Online (Sandbox Code Playgroud)

删除连续字符 (1+) 并将数字转换为字符串,以防您也需要这样做。


测试:

$string = [
    'AXXDBD',
    '123558',
    12333
];
$string = array_map('not_twice', $string);
echo '<pre>' . print_r($string, true) . '</pre>';
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
    [0] => AXDBD
    [1] => 12358
    [2] => 123
)
Run Code Online (Sandbox Code Playgroud)