Регулярное выражение: Первое вхождение между двумя символами, если есть два символа

#regex

Вопрос:

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

Например, в строках ниже:

 25 de Março - Centro Histórico de São Paulo, São Paulo - SP, Brasil
Centro Histórico de São Paulo, São Paulo - SP, Brasil
Rua Hamilton Prado, 398 - Chácara Belenzinho, São Paulo - SP, 03376-000, Brasil
 

Я хочу понять, что стоит за символом» -«. Однако во второй строке есть только одно» -«, поэтому я хочу получить все, что за ней стоит.

Результаты, которые я ищу, таковы:

 Centro Histórico de São Paulo, São Paulo
Centro Histórico de São Paulo, São Paulo
Chácara Belenzinho, São Paulo
 

Я попробовал следующее регулярное [^-n] (?=-[^n-]*$) выражение, но оно не возвращает то, что я хочу, в последней строке.

Можно ли это решить с помощью регулярного выражения?

Ответ №1:

При желании вы можете сопоставить первую часть и записать вторую часть в группу

 ^(?:. ?- )?(. ?) -
 
  • ^ Начало строки
  • (?:. ?- )? Необязательно сопоставлять как можно меньше символов до тех пор, пока -
  • ( Группа захвата 1
    • . ? Сопоставьте как можно меньше символов
  • ) - Сомкнуть группу и сопоставить -

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

Или, например, с окружающими пробелами и классом отрицаемых символов, соответствующим любому символу, кроме новой строки или -

 ^(?:[^n-] -)?([^n-] )-
 

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

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

1. Спасибо! Это очень помогло =)

Ответ №2:

ИМХО, было бы лучше пройтись по строке самостоятельно.

 const str = `25 de Março - Centro Histórico de São Paulo, São Paulo - SP, Brasil
Centro Histórico de São Paulo, São Paulo - SP, Brasil
Rua Hamilton Prado, 398 - Chácara Belenzinho, São Paulo - SP, 03376-000, Brasil`;

const addresses = str
.split('n')
.map(address => address
    .split(' - ')
    .slice(-2, -1)
).join('n');

console.log(addresses); 

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