удалить двойные одинарные кавычки, но не одинарные - PullRequest
0 голосов
/ 19 февраля 2019

Как удалить двойные одинарные кавычки, но не одиночные кавычки в строке в Ruby?Например, от That's 'large' до That's large.

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Это один из тех проблем, с которыми я сталкиваюсь при синтаксическом анализе XML или HTML, но это невозможно сделать с помощью регулярных выражений, но вы можете притворяться, будто в основном это сработает.Вы можете настроить его навсегда и не получить права.

Вы можете искать сбалансированные кавычки, то есть только кавычки в парах, но это не помогает.That's 'large' должен быть выделен как Thats large' или That's large?

Вместо этого вам нужно дать ему понимание грамматики английского языка, и когда ' является апострофом противцитаты.Что-то простое, что знает основы схваток и притяжений.Сокращения: don't, won't, I'll.Обладает: Joe's и s'.И, может быть, вы можете использовать регулярные выражения, чтобы пропустить их.

Но это быстро усложняется.KO'd.Или что, если вы хотите указать конкретное произношение: fo'c's'le.Или чье-то имя O'Doole.

То, что вы могли бы обойти, убрав пару кавычек, начинающихся в начале слова и в конце слова.It's clear he said, 'this isn't a contraction'. Соответствие кавычки перед this и кавычкой в ​​конце contraction, вероятно, возможно, безопасно.

# Use negative look behind and ahead to look for quotes which are
# not after and before a word character.
# Use a non-greedy match to catch multiple pairs of quotes.
re = /(?<!\w)'(.*?)'(?!\w)/
sentence.gsub(re, '\1')

Это работает во многих случаях.

That's 'large' -> That's large
Eat at Joe's -> Eat at Joe's
I'll be Jane's -> I'll be Jane's
Jones' three cats' toys. -> Jones' three cats' toys.
It's clear he said, 'this isn't a contraction'. -> It's clear he said, this isn't a contraction.
'scare quotes' -> scare quotes
The 69'ers' drummer -> The 69'ers' drummer
Was She's success greater, or King Solomon's Mines's? -> Was She's success greater, or King Solomon's Mines's?
The 69'er's drummer and their 'contractual obligations'. -> The 69'er's drummer and their contractual obligations.
He said, 'it's clear this doesn't work'. -> He said, it's clear this doesn't work.

Но не всегда.

His 'n' Hers's first track is called 'Joyriders'. -> His n Hers's first track is called Joyriders.

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

0 голосов
/ 19 февраля 2019

Небольшое отклонение - если одинарные кавычки встречаются только вокруг символов слова, то есть это символы от az, AZ, 0-9 или символа _ (подчеркивание).Вы можете использовать это:

phrase = "That's 'large' and not 'small', but it's still 'amazing'."
phrase.gsub(/'(\w*)'/, '\1')
=> "That's large and not small, but it's still amazing."

Но, как говорит Шверн, если вы пытаетесь сделать что-то кроме простой манипуляции с текстом, вы скоро окажетесь увлеченными крайними случаями.

0 голосов
/ 19 февраля 2019

Попробуйте это регулярное выражение:

\B'((?:(?!'\B)[\s\S])*)'

Замените каждый матч на \1

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

Код ( Результат ):

re = /\B'((?:(?!'\B)[\s\S])*)'/m
str = 'That\'s \'large\'
The 69\'ers\' drummer won\'t like this.
He said, \'it\'s clear this does not work\'. It does not fit the \'contractual obligations\''
subst = '\\1'

result = str.gsub(re, subst)

# Print the result of the substitution
puts result

Объяснение:

  • \B - соответствует не-словная граница
  • ((?:(?!'\B)[\s\S])*) - соответствует 0+ вхождений любого символа [\s\S], который (не начинается с ', за которым следует граница без слов).Это зафиксировано в группе 1.
  • ' - соответствует '
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...