Вы можете использовать чередование , чтобы сначала сопоставить то, что вы не хотите, и захватить в группе то, что вы хотите.
Этот шаблон не требует, чтобы дефис находился в строке на основе вашего шаблона, где вы используете отрицательный символьный класс [^-]+
, чтобы не соответствовать дефису, но на самом деле не соответствует ему как обязательному символу.
^.*-|(?:^|[ \t]+)([^\s()]+)(?!\S)
Пояснение
^
Начало строки .*-
Соответствует любому символу 0+ раз, а затем -
поэтому он будет соответствовать последнему дефису |
или (?:^|[ \t]+)
Утверждать начало строки или совпадать с 1+ пробелом или табуляцией ([^\s()]+)
Захват в группе 1, соответствующий + times not a whitespace char or
(or
) ` (?!\S)
Отрицательный взгляд вперед, утверждаем, что справа не является символом без пробела
Regex demo
Edit
Если вы хотите использовать замену, вы можете сопоставить все, что вы не хотите сохранять, и заменить на пустую строку:
^.*-\s*|\s*\S*[()]+\S*
Объяснение
^.*-\s*
Соответствует любой единице символов последнему дефису, за которым следует 0+ пробельных символов |
Или \s*
Совпадение 0+ раз с пробелами \S*[()]+\S*
Совпадение 0+ раз с непробельным символом, но не с (
или )
1+ раз и снова 0+ раз непробельный символ
Regex demo
Например
$string = "Tablet - MS Surface Pro 4 - Ricardo Cortez (OFFSITE)"
$name = $string -replace '^.*-|\S*[()]+\S*',''
echo $name