2010-11-08 2 views
2

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

Например, если у меня была строка:

The "cat and the hat" sat on a rat. The 'mouse ran' up the clock. 

Затем определить бы следующее:

cat and the hat 
mouse ran 

Что бы регулярное выражение?

+0

Можно ли избежать кавычек: «Это не забавно!», Жаловался О'Малли. »? – tchrist

+0

Какой язык регулярных выражений? – tchrist

+0

Правда, не думал об этом. – Jason

ответ

3

(["']).*?\1

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

+0

Это нужно '(? S)', в строке могут быть разрывы строк. Кроме того, вы дали пользователю вещь с кавычками, все еще вокруг нее, и они просили об этом без окружающих цитат. – tchrist

+0

Благодарим вас за помощь, как бы вы выбрали цитаты. – Jason

+0

Mine не оставил кавычки в: просто используйте '$ + {guts}', как я и предложил. – tchrist

1
#!/usr/bin/env perl 
use 5.010; 

my $quoted_rx = qr{ 
    (?<quote> ['"]) # SO highlight bug "' 
    (?<guts> 
     (?: (?! \k<quote>) .) * 
    ) 
    \k<quote> 
}sx; 

my $string = <<'END_OF_STRING'; 
The "cat and the hat" sat on a rat. The 'mouse ran' up the clock. 
END_OF_STRING 

while ($string =~ /$quoted_regex/g) { 
    say $+{guts}; 
} 

Каждый раз, когда вы подходите, цитата типа будет $+{quote} и материал между ними будет в $+{guts}.

Это работает только для U + 27 (APOSTROPHE) и U + 22 (ЦИТАТЫ ЦИКЛА). Если вы хотите, чтобы он работал на такие вещи, как «это» и «это», вам нужно быть более привлекательным. Существует свойство \p{Quotation_Mark} для любого типа кавычек и \p{Pi} для начальной пунктуации и \p{Pf} для окончательной пунктуации.

+0

будет то же самое в php – Jason

+0

Шаблон будет таким же, но цикл будет другим. – tchrist

+0

Я тестирую его на http://gskinner.com/RegExr/, и он, кажется, не собирает их. Я делаю следующее. qr {(? ['"]) (? (?: (?! \ k ).) *) \ k } ix; – Jason

0
$s = 'The "cat and the hat" sat on a rat. The \'mouse ran\' up the clock.'; 
preg_match_all('~([\'"])(.*?)\1~s', $s, $result); 
print_r($result[2]); 

выход (как показано на ideone):

Array 
(
    [0] => cat and the hat 
    [1] => mouse ran 
)

preg_match_all сохраняет все результаты матчей в массиве массивов. Вы можете изменить способ размещения результатов, но по умолчанию первый массив содержит общие совпадения ($0 или $&), второй массив содержит содержимое первой группы захвата ($1, $2 и т. Д.) И т. Д.

В этом случае $result[0] - это полностью цитируемые строки из всех совпадений, $result[1] - это цитата, а $result[2] - это все, что было между кавычками.

+0

Спасибо. Я проверю это. – Jason

Смежные вопросы