Как создать регулярное выражение, чтобы возвращать все, что после последнего дефиса?

#regex #string

#регулярное выражение #строка

Вопрос:

Я пытаюсь создать регулярное выражение (с чем я всегда борюсь), чтобы возвращать все после последнего дефиса.

Например, это были бы входные строки:https://mywebsite.com/company/company-name-page-ddd.l
https://mywebsite.com/company/another-company-page-lloy.l

и я хотел бы вернуть только ddd.l или во 2-м примере lloy.l

Я думал, что это будет что-то вроде ^-([a-zA-Z0-9-.=^$] )/?$ но это не решает первую часть URL и каталога.

Это должно быть чистое регулярное выражение, поэтому никакого php, поскольку он используется в качестве фильтра в плагине WordPress на стороне пользователя.

Кто-нибудь может помочь?

Комментарии:

1. Может ли это быть просто [^-] $ ?

2. @JvdV Нет, как общее решение, которое не будет работать, потому что оно вернет все перед первым дефисом, а не последним.

3. @TimBiegeleisen, как же так? Может быть, я просто неправильно читаю этот вопрос, но это то, что он вернет, что соответствует тому, что, по-видимому, после OP.

Ответ №1:

Вы могли бы развернуть якоря и заканчивать на $ вместо того, чтобы начинать с ^

Затем вы должны удалить - из класса character. Значение находится в группе 1.

 -([a-zA-Z0-9.=^$] )$
  

Демонстрация регулярных выражений

Если поддерживается, вы также можете сопоставить дефис и использовать K или использовать положительный взгляд назад, чтобы указать дефис слева (?<=-) и опустить группу, чтобы получить только совпадение

-K[a-zA-Z0-9.=^$] $ или (?<=-)[a-zA-Z0-9.=^$] $

Как ранее php был помечен:

 $strings = [
    "https://mywebsite.com/company/company-name-page-ddd.l",
    "https://mywebsite.com/company/another-company-page-lloy.l"
];

foreach ($strings as $s) {
    preg_match("~-K[a-zA-Z0-9.=^$] $~", $s, $match);
    echo $match[0] . PHP_EOL;
}
  

Вывод

 ddd.l
lloy.l
  

Ответ №2:

Я бы использовал preg_replace здесь, чтобы удалить все содержимое с начала ввода до последнего тире включительно:

 $input = "Some text here - and other text as well - the end";
$output = preg_replace("/^.*-/", "", $input);
echo $input . "n" . $output;
  

Это печатает:

 Some text here - and other text as well - the end
 the end
  

Комментарии:

1. извините, мне пришлось пересмотреть вопрос, поскольку это невозможно сделать в php — просто регулярное выражение

2. Затем используйте ^.*-(.*)$ , и то, что вы хотите, будет в первой группе захвата.

Ответ №3:

я думаю, ваша проблема в том, что вы начали выражение с ^- , поэтому оно не совпало.

Если я прочитаю описание вашей проблемы, я думаю, вы хотите, чтобы вся строка полностью совпадала, но только часть после последнего дефиса в соответствующей группе. Для этого я рекомендую начать с ^.* , чтобы перехватить все в начале.

таким образом, полное регулярное выражение будет:

 ^.*-([w.] )$
  

Я действительно рекомендую отменитьhttps://regex101.com / разработать регулярное выражение.

 php > preg_match('/^.*-([w.] )$/', "https://mywebsite.com/company/company-name- 
page-ddd.l" , $matches);
php > print_r($matches);
Array
(
    [0] => https://mywebsite.com/company/company-name-page-ddd.l
    [1] => ddd.l
)
  

Ответ №4:

^.*(-.*)$

Объяснение: подтвердите начало строки, затем выберите любой символ 0 или более раз, за которым следует (и начните захват) дефис, за которым следует любой символ 0 или более раз (и закройте захват), и подтвердите конец строки.

В первой группе захвата будет то, что вам нужно.