Игнорирование апострофа при захвате содержимого в одинарных кавычках REGEX - PullRequest
0 голосов
/ 07 марта 2019

Для меня проблема заключается в том, чтобы захватить содержимое внутри одинарных кавычек (например, 'xyz').
Но апостроф, который является тем же символом, что и одиночная кавычка ('), встает на пути!

Регулярное выражение, которое я написал: /(\w\'\w)(*SKIP)(*F)|(\'[^\']*\')/

Пример, который я использовал: Hello ma'am 'This is Prashanth's book.'

Что нужно захватить: 'This is Prashanth's book.'.

Но, что запечатлено: 'This is Prashanth'!

Вот ссылка на то, что я попробовал на онлайн-тестере регулярных выражений

Любая помощь очень ценится. Спасибо!

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Вы не можете использовать [^\'] для захвата текста, который содержит ' с помощью in, и в вашем примере This is Prashanth's book. содержит символ ' внутри текста.Вам нужно изменить свое регулярное выражение, чтобы использовать .*? вместо [^\'], и вы можете написать свое регулярное выражение следующим образом:

(\w'\w)(*SKIP)(*F)|('.*?'\B)

Демо с обновленным регулярным выражением

Кроме того, вам не нужно избегать ни одной кавычки ', поскольку в регулярном выражении это не имеет особого значения.

Из вашего примера неясно, хотите ли вы получить захваченное совпадениесодержать ' вокруг матча или нет.Если вы не хотите, чтобы ' были захвачены в матче, вы можете использовать регулярное выражение на основе поиска и использовать это,

(?<=\B').*?(?='\B)

Объяснение регулярного выражения:

  • (?<=\B') - этот положительный взгляд гарантирует, что тому, что захватывается в матче, предшествует одинарная кавычка, которой не предшествует символ слова, что обеспечивается \B
  • .*?- Захватывает текст без жадности
  • (?='\B) - Гарантирует, что за сопоставленным текстом следует одинарная кавычка, а \B гарантирует, что он не соответствует кавычке, за которой сразу следует какой-либо символ слова.Например, он не будет соответствовать конечной кавычке, такой как 's

Демо

1 голос
/ 07 марта 2019

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

\B'\K(?:(?!'\B).)+

Нажмите для демонстрации

Пояснение:

  • \B - граница без слов
  • ' - соответствует '
  • \K - забудьте все, что соответствует
  • (?:(?!'\B).)+ - соответствует 1+ появлению любого символа (кроме новой строки), который не начинается с ', за которым следует граница без слов
...