#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 словесных символов(?:
Группа без захвата(?: -*|- ?)
либо совпадение-
, ЛИБО совпадение 1 раз-
и необязательноw
Сопоставьте 1 словесных символов
)*
Закройте группу без захвата и при необходимости повторите
Комментарии:
1. Хотя мне нравится простота первого выражения регулярного выражения, которое вы вставили. При тестировании со следующими данными примера:
Information and Telecommunication - Salaries and Wages - Non-Management - 1--2
, получены 1 и 2 как отдельные совпадения.2. @Vivek Вы могли бы, например, повторить — например
w (?:(?: -*|- ?)w )*
, см. regex101.com/r/8zLBY0/13. решение, которое вы только что предоставили, работает. Если вы хотите отредактировать свой ответ, чтобы вставить этот новый ответ, сделайте это. Проходя через внутреннюю группу, наиболее не захватывающую:
(?: -*|- ?)
я сделал следующее наблюдение, что пробелы не могут быть изображены в чередовании со стенографией «s».