Попытка сопоставить символы между разделителями

#regex

Вопрос:

Разделитель - (с пробелом до и после тире), а текст : Information and Telecommunication - Salaries and Wages - Non-Management . Тексты, с которыми я пытаюсь сопоставить Information and Telecommunication , Salaries and Wages следующие:, и Non-Management

Самое близкое регулярное выражение , до которого я добрался, — это (s-s)?[ws] (s-s)? , но, к сожалению, совпадение приводит Non и Management к отдельным совпадениям.

Еще одно дело, которое нужно попробовать: Information and Telecommunication - Salaries and Wages - Non-Management - 1--2

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

1. Не лучше ли разделить строку на» -`?

2. @JohnyL, функции разделения могут быть просты для одного разделителя символов, но не для шаблона, такого как » — » (с пробелами до и после тире).

Ответ №1:

На самом деле вам понадобится регулярное выражение, которое соответствует символам слов, пробелам или дефисам, которые находятся непосредственно перед - или в конце строки

Следующее регулярное выражение должно выполнять

 (w(?:[ws]|w-w)*)(?=(?:s-s)|$)
 

Объяснение

 (             # matching group start
  w          # match any word character once
    (?:       # start of a non-matching group
      [ws]  # match any word character or space character
      |       # OR
      w-w   # match any hyphen that's in between two word characters
    )*        # find this non-matching group zero or multiple times
)             # matching group end
(?=           # lookahead start
  (?:s-s)   # non-matching group for space hyphen space
  |           # OR
  $           # end of string
)             # lookahead end
 

ДЕМОНСТРАЦИЯ

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

1. При тестировании со следующими данными примера: Information and Telecommunication - Salaries and Wages - Non-Management - 1--2 , получены 1 и 2 как отдельные совпадения.

Ответ №2:

Вы можете сопоставить пробел с необязательным дефисом - или дефис с необязательным пробелом - , но не -

 w (?:(?: -*|-  ?)w )*
 

Шаблон совпадает

  • w Сопоставьте 1 словесных символов
  • (?: Группа без захвата
    • (?: -*|- ?) либо совпадение и 0 - , ЛИБО совпадение 1 раз - и необязательно
    • w Сопоставьте 1 словесных символов
  • )* Закройте группу без захвата и при необходимости повторите

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

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

1. Хотя мне нравится простота первого выражения регулярного выражения, которое вы вставили. При тестировании со следующими данными примера: Information and Telecommunication - Salaries and Wages - Non-Management - 1--2 , получены 1 и 2 как отдельные совпадения.

2. @Vivek Вы могли бы, например, повторить — например w (?:(?: -*|- ?)w )* , см. regex101.com/r/8zLBY0/1

3. решение, которое вы только что предоставили, работает. Если вы хотите отредактировать свой ответ, чтобы вставить этот новый ответ, сделайте это. Проходя через внутреннюю группу, наиболее не захватывающую: (?: -*|- ?) я сделал следующее наблюдение, что пробелы не могут быть изображены в чередовании со стенографией «s».