2014-11-15 3 views
1

Я новичок в регулярном выражении и не могу найти способ сделать это легко. Я хотел бы, чтобы удалить каждое слово, не начинающееся с # и поставить запятую между ними, так, например, если у меня есть:Regex Find and Replace: Удалить все, кроме слов, начинающихся с «#»?

Cookie Recipe for n00bs 
#cookie #recipe #chocolate To do this you have to etc... 
Bla bla bla mumbo jumbo 

Я хотел бы получить в результате:

cookie, recipe, chocolate 

Если бы вы могли помочь мне, было бы здорово, спасибо и у вас будет хороший день!

+0

вместо того, чтобы удалять все слова, не предшествующие символу '#', почему вы не пытаетесь сопоставить слова, предшествующие символу '#'? –

+2

Какой язык/инструмент вы используете? –

+0

Я пытаюсь использовать это в контексте поиска и замены. Я создаю макрос Maestro для клавиатуры, который фильтрует буфер обмена после этого правила поиска и замены. Я не знаю, как копировать только найденный Find. – drbernardi

ответ

0

Вы пропустили, чтобы указать, какой язык программирования вы используете. А вот пример, в PHP, который использует Perl совместимые регулярные выражения:

$text = <<<EOF 
Cookie Recipe for n00bs 
#cookie #recipe #chocolate To do this you have to etc... 
Bla bla bla mumbo jumbo 
EOF; 

$pattern = '/((?<=#)\w+)/'; 
preg_match_all($pattern, $text, $matches); 

echo implode(', ', $matches[0]); 

Я использую так называемый положительный утверждение (?<=#) назад ', которое гарантирует, что только слова подбираются, которые предшествуют #, но, и это важно, что он не включает в себя самого # в матче. После выражения lookbehind я сопоставляю как можно больше словных символов \w.

После этого implode() используется, чтобы объединить полученные совпадения с ,. Регулярное выражение не может использоваться для этой части задания.

Вы можете увидеть, как это регулярное выражение работает на Regex101.com

0

Попробуйте это:

$re = "/#\\w+/"; 
$str = "#cookie #recipe #chocolate To do this you have to etc..."; 
$str .= "#cookie #recipe #chocolate To do this you have to etc..."; 

preg_match_all($re, $str, $matches); 
[email protected](", ",@$matches[0]); // for adding comma(,) and space(). 
var_dump($matches,$r); 

выход:

array (size=1) 
    0 => 
    array (size=6) 
     0 => string '#cookie' (length=7) 
     1 => string '#recipe' (length=7) 
     2 => string '#chocolate' (length=10) 
     3 => string '#cookie' (length=7) 
     4 => string '#recipe' (length=7) 
     5 => string '#chocolate' (length=10) 

string '#cookie, #recipe, #chocolate, #cookie, #recipe, #chocolate' (length=58) 

live demo