![]() |
|
![]() |
||||||
![]() |
Это не то, что можно сделать одним регулярным выражением, каким бы оно ни было сложным. Для поиска чего-то между двумя символами шаблон вроде /x([^x]*)x/ даст в $1 промежуточную подстроку. Для различных ограничителей нужно что-то вроде /alpha(.*?)omega/. Но ни один из этих шаблонов не работает со вложенностью. Для сбалансированных выражений с разделителями (, {, [ или < используйте модуль Regexp::Common из CPAN. В остальных случаях придется писать парсер.
Если вы действительно хотите написать парсер, то есть ряд модулей и странных штук, которые сильно упростят вам жизнь. В CPAN есть Parse::RecDescent, Parse::Yapp и Text::Balanced; также имеется программа byacc. Начиная с Perl 5.8, в стандартную поставку входит Text::Balanced. Простой подход с разрушением строки изнутри, который стоит попробовать — последовательная выборка компонентов с наибольшей вложенностью: while (s/BEGIN((?:(?!BEGIN)(?!END).)*)END//gs) { # сделать что-то с $1 } Более хитрый подход — переложить эту работу на движок регулярных выражений Perl. Вот код, который скорее годится на Конкурс запутанных исходников, но он действительно работает: Mr. D
Beshenov
26.11.2008
|
Меню
Подписка на RSS:
Поиск
Облако тегов
.net
array
asp
bash
browser
charset
check
class
clean
convert
count
create
css
curl
database
date
delete
directory
download
element
email
equivalent
extension
file
find
form
format
function
get
height
html
http
ie
image
javascript
jquery
load
mysql
number
page
perl
php
random
scriplet
send
shell
size
sql
string
text
time
url
utf8
variable
vb
visual basic
width
window
xml
xslt
|
![]() |
![]() |
![]() |
||
![]() |
![]() |