Perl Pattern Matching Question - PullRequest
       9

Perl Pattern Matching Question

0 голосов
/ 02 декабря 2010

Я пытаюсь сопоставить шаблоны в Perl и мне нужна помощь.

Мне нужно удалить из строки все, что соответствует [xxxx], т. Е. Открывающиеся скобки - внутри нее - первая закрывающая скобка, которая встречается.

Поэтому я пытаюсь заменить пробелом открывающую скобку, вещи внутри, первую закрывающую скобку следующим кодом:

   if($_ =~ /[/)
  {
    print "In here!\n";
    $_ =~ s/[(.*?)]/ /ig;
  }

Точно так же мне нужно сопоставить то есть угловые скобки-вещи внутри него - сначала закрывающую угловую скобку.

Я делаю это, используя следующий код:

   if($_ =~ /</)
  {
    print "In here!\n";
    $_ =~ s/<(.*?)>/ /ig;
  }

Это как-то не похоже на работу. Мой пример данных, как показано ниже:

 'Joanne' <!--Her name does NOT contain "Kathleen"; see the section "Name"--> "'Jo'" 'Rowling', OBE [http://news bbc co uk/1/hi/uk/793844 stm Caine heads birthday honours list]  BBC News  17 June 2000  Retrieved 25 October 2000  , [http://content scholastic com/browse/contributor jsp?id=3578 JK Rowling Biography]  Scholastic com  Retrieved 20 October 2007  better known as 'J  K  Rowling' ,<ref name=telegraph>[http://www telegraph co uk/news/uknews/1531779/BBCs-secret-guide-to-avoid-tripping-over-your-tongue html Daily Telegraph, BBC's secret guide to avoid tripping over your tongue, 19 October 2006] is a British <!--do not change to "English" or "Scottish" until issue is resolved --> author best known as the creator of the [[Harry Potter]] fantasy series, the idea for which was conceived whilst on a train trip from Manchester to London in 1990  The Potter books have gained worldwide attention, won multiple awards, sold more than 400 million copies and been the basis for a popular series of films, in which Rowling had creative control serving as a producer in two of the seven installments  [http://www businesswire com/news/home/20100920005538/en/Warner-Bros -Pictures-Worldwide-Satellite-Trailer-Debut%C2%A0Harry Business Wire - Warner Bros  Pictures mentions J  K  Rowling as producer ] 

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

Ответы [ 3 ]

2 голосов
/ 02 декабря 2010

Вам нужно использовать это:

1 while s/\[[^\[\]]*\];

Демо:

% echo "i have [some [square] brackets] in [here] and [here] today."| perl -pe '1 while s/\[[^\[\]]*\]/NADA/g'
i have NADA in NADA and NADA today.

По сравнению с ошибкой:

% echo "i have [some [square] brackets] in [here] and [here] today." | perl -pe 's/\[.*?\]/NADA/g'
i have NADA brackets] in NADA and NADA today.

Рекурсивное регулярное выражение, которое я оставляю какупражнение для читателя.:)


РЕДАКТИРОВАТЬ: Эрик Стром любезно предоставил рекурсивное решение, которое вам не нужно использовать 1 while:

% echo "i have [some [square] brackets] in [here] and [here] today." | perl -pe 's/\[(?:[^\[\]]*|(?R))*\]/NADA/g'
i have NADA in NADA and NADA today.
1 голос
/ 02 декабря 2010

$_ =~ /someregex/ не изменится $_

Только примечание, $_ =~ /someregex/ и /someregex/ делают одно и то же.

Кроме того, вам не нужно проверятьналичие [или <или круглые скобки: </p>

s/\[.*?\]/ /g;</p> <p>s/<.*?>/ /g;

будет выполнять ту работу, которую вы хотите.

Редактировать: изменил код в соответствии с тем, что выизменение $ _

1 голос
/ 02 декабря 2010
  • Квадратные скобки имеют особое значение в синтаксисе регулярных выражений, поэтому избегайте их: /\[.*?\]/.(Вам также не нужны здесь круглые скобки, и сопоставление без учета регистра бессмысленно.)

  • Прошло много времени с тех пор, как мне пришлось бороться с Perl, ноЯ уверен, что тестирование $ _ с помощью регулярного выражения также изменит $ _ (даже если вы не используете s ///).Вам все равно не нужен тест;просто запустите замену, и если шаблон нигде не совпадает, то он ничего не сделает.

...