Как я могу сопоставить неполные одинарные кавычки, игнорируя апострофы? - PullRequest
2 голосов
/ 22 мая 2019

Я пытаюсь сопоставить предложения в тексте, где отсутствует заключительная одинарная кавычка (я использую PHP).Вот простое решение:

~'[^']*$~

, но оно не справляется с апострофами.

Например, в этих предложениях

'This is incomplete
'This isn't incomplete.'  
I said 'this is incomplete.   
I said 'this isn't incomplete but I was wrong.

Я хочу соответствоватьвсе они, за исключением второго, который не пропускает свою заключительную кавычку.

Я пытался использовать отрицательный прогноз, чтобы исключить правильно закрытые кавычки (например, где следует пробел, точка (или другой конец)- пунктуация предложения) или конец строки, но я не могу понять это правильно.

(Случаи апострофов, которые следует пропустить, будут любыми, если после апострофа следуют s, l, r, d илиv - давайте не будем обращать внимания на тот факт, что множественное число притязаний может сопровождаться пробелом, поскольку это усложняет задачу.)

Ответы [ 4 ]

3 голосов
/ 22 мая 2019

Как узнать в I said 'this isn't incomplete but I was wrong., что указанная часть должна заканчиваться после incomplete.Разве это невозможно с обычными средствами.

Если предположить, что вы имеете дело с однострочными строками, моя довольно простая идея будет

\B'(.*?)'\B|\B'(.*[^'\s])

и заменена на '$1$2'.См. эту демонстрацию в regex101 .

Идея состоит в том, чтобы

  • \B'(.*?)'\B использовать любые "полные" цитаты, которые начинаются с одной кавычки, которой не предшествует символом слова (\B граница без слова ) до одинарной кавычки, за которой не следует символ слова и не захватывает содержимое до $1.
  • \B'(.*[^'\s]) Найдите оставшиеся ', которым не предшествует символ слова, и запишите что-нибудь до последнего символа, который не является пробелом \s или одинарной кавычкой $2.
  • Наконецзамените уже завершенный $1 и неполный $2 на '$1$2'.Это как бы эта идея .

Далеко от совершенства, но надеюсь, что немного помощи.

1 голос
/ 22 мая 2019

Вы можете использовать

preg_match("~^(?:[^']|\b'\b)*(?!\b'\b)'(?:[^']|\b'\b)*$~", $s)

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

Подробности регулярных выражений

  • ^ - начало строки
  • (?:[^']|\b'\b)* - 0 или более повторений любого символа, но ' или любого ', заключенного в слово char
  • (?!\b'\b)' - ' незаключенный в слово chars
  • (?:[^']|\b'\b)* - 0 или более повторений любого символа, но ' или любой ' заключенный в слово char
  • $ - конец строки.

Регулярный график :

enter image description here

enter image description here

0 голосов
/ 22 мая 2019

вы можете добавить модификаторы "global" или "multiline" к регулярному выражению.Цитата может быть закрыта и на следующей строке.

0 голосов
/ 22 мая 2019

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

  • четное число апострофов
  • Начинается с одного
  • заканчивается одним

Все эти условия вместе должны работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...