Замена сложного регулярного выражения одинарной кавычкой

#regex

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

Вопрос:

У меня есть набор строк, для которых я хотел бы заменить одинарные кавычки двойными. Но иногда заменяемая одинарная кавычка находится в конце строки, иногда одинарную кавычку следует заменить, поскольку она следует за S для притяжательного.

Пример :

Песня ‘Miss you’ включена в альбом Rolling Stones ‘Voodoo Lounge’

должно быть

Песня «Miss you» включена в альбом Rolling Stones «Voodoo Lounge»

Спасибо за вашу помощь 🙂

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

1. На каком языке? Что вы пробовали?

2. если ваш инструмент / язык поддерживает отрицательный взгляд сзади: это грязный и быстрый способ: (?<!s)'

3. @cappie013 Я думаю, что с ruby вы можете попробовать регулярное выражение lookbehind. Я сказал, что это грязно и быстро, потому что в некоторых случаях это приведет к сбою: Micheal Jackson's album 'Dangerous' Dangerous тоже заканчивается на s .

4. Интересно, но не уверен, что это возможно. Как регулярное выражение будет указывать контекст? Что, если есть предложение типа The song 'Blurred Lines' is featured... Как он узнает, что ‘s’ не является притяжательным?

Ответ №1:

Регулярные выражения могут работать только с необработанным текстом. Это не может определить контекст или грамматику. Таким образом, практически невозможно создать регулярное выражение, которое будет правильно определять вхождения непереходных s символов.

Однако, если вы хотите игнорировать такие случаи и сопоставлять их с остальными, вы можете использовать следующее регулярное выражение с утверждениями поиска:

 (?<!s)'(?!sb)
  

Обратите внимание, что это не будет соответствовать допустимым случаям, таким как Blurred Lines , Dangerous и т.д.

Рабочая демонстрация

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

1. Это не работает с этой строкой, например: химический символ калия — ‘Pt’

2. @cappie013: Ах, я не знал, что это тоже возможно. Обновлен ответ.

3. Почти идеально, спасибо. Но, как сказал @kent, для такого рода строк, вероятно, нет решения. Альбом Майкла Джексона ‘Dangerous’ => Действительно, невозможно определить, является ли это притяжательным S или нет