Есть много вопросов о сопоставлении одинарных и двойных кавычек, но я не могу найти ни одного, который исключал бы сокращения и знаки владения.
Вот примеры, которые я использую для отображения совпадений на regex101.com.
" I'm not going, so won't you go instead? "
"Hi", 'I can't go!'
I'm not going, so won't you go 'instead'?
O'Connell's bar is "good"
O'Connells' bar is 'excellent'
На данный момент /(?!\b["']\b)["']/gm — лучшее, что я могу создать, но оно не соответствует финалу Connells', чего не должно быть.
Я пробовал добавить больше негативного просмотра вперед и назад, даже попросил gpt4 попробовать (и это не удалось 10 раз, прежде чем я перестал спрашивать об этом)
Мое лучшее регулярное выражение говорит: соответствовать одинарным или двойным кавычкам, но не найденным в слове. Как я могу добавить еще одно отрицательное высказывание, а не если в конце слова встречается окончание s (т. е. наличие множественного числа)
Это не то, что вы можете сделать с помощью регулярного выражения. Если вы видите girls', как вы думаете, будет ли это притяжательное слово или конец цитаты? Вам нужна какая-то обработка естественного языка, которая понимает контекст.
Да, я не уверен, есть ли хороший способ отличить притяжательное множественное число от окончания одинарных кавычек, не выполняя какой-либо проверки на четность. Шаблон Виктора обходит эту проблему, делая исключение для буквы s, но это, конечно, приведет к проблемам, если у вас есть слово, оканчивающееся на s, заключенное в одинарные кавычки.
Ваш пример IMO мешает решению, которое соответствует одинарным кавычкам.
Я вижу, что есть некоторые проблемы, которые я не учел, поэтому спасибо за ответы, но @WiktorStribiżew предлагает решение, которое работает так, как требуется в текущей ситуации. Однако я не вижу способа отметить это как правильный ответ.
@macasas Это было предложение, я добавил ответ.





Отказ от ответственности: регулярное выражение не может отличить апостроф притяжательного падежа от закрывающей одинарной кавычки, 'The boys' room' будет неоднозначным.
Отвечая на текущий вопрос, а именно на часть «нет, если в конце слова заканчивается s», вы можете добавить отрицательный просмотр (?<!s.\B) в конце регулярного выражения.
Кроме того, поскольку вы хотите сопоставить только одинарную или двойную кавычку и исключить ' между символами слов, я предлагаю удалить " из просмотра вперед (если вы также не думаете, что " может появляться между символами слов, но я не могу думать сценариев из реальной жизни. Он может обозначать дюйм, а затем просто следовать за цифрой, и тогда вам нужно будет исключить (?<=\d)").
Итак, в настоящее время шаблон обновления может выглядеть так
(?!\b'\b)["'](?<!s.\B)
См. эту демонстрацию регулярных выражений. Подробности:
(?!\b'\b) — отрицательный просмотр вперед, который не соответствует совпадению, если сразу справа от текущего местоположения есть символ ', заключенный в буквы/цифры/подчеркивания.["'] - символ ' или "(?<!s.\B) - отрицательный просмотр, который не соответствует совпадению, если сразу слева от текущего местоположения (то есть местоположения в строке сразу после ' или ") есть s + совпадающий символ (' или " могут быть сопоставлены оба с ., это самый простой шаблон, но вы, конечно, можете повторить ['"], но я не вижу для этого смысла), и тогда требуется несловная граница, т. е. после ' и " может быть только несловная граница. -word char или конец строки.И есть более эффективный способ написать это с двумя взглядами назад:
["'](?<!s.\B)(?<!\b'\b)
Но если вы не можете использовать просмотр назад, вы также можете использовать два просмотра вперед (что делает его гораздо более неэффективным):
(?!\b'\b)(?<!s(?=.\B))["']
Может
(?!\b'\b)["'](?<!s.\B)? См. regex101.com/r/COLA6h/1