Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
var tester = VerEx()
.linestart()
.afterthis( "http" )
.probably( "s" )
.andnnow( "://" )
.possible( "www." )
.anythingexcept( " " )
.endofline();
если (коллекция.пуст<b>ой</b>()) или если (массив.пуст<b>ое</b>()) или если(дерево.пуст<b>ая</b>()), что несколько режет глаз. Ну и длина слова в русском в среднем длиннее чем в английском.А так, я думаю, что подобная библиотека поможет джуниору хотя бы не начать плеваться от фразы «регулярное выражение».Здесь согласимся, но! нам в свое время помогло руководство, где грубо говоря слева было написано вербальное изложение, а справа — регулярное.
Я бы начал с того, что не выдавал бы патченный php nuke за собственную разработку.Мы и не выдаем. На главной первой же строкой в основном блоке написано что это «патченая пхпнюке».
«больше 10 лет в веб-программинге, больше 15 лет в программировании.» — нихрена не значит, если даже свою витрину нормально оформить не в состоянии, потому и «Присутствует заинтересованность: крупных проектах «с нуля» по ТЗ (бюджет от 5,000$) и в почасовой работе (от 40$ в час).» — слегка опупевшие заявления.
Открытие страницы: 0,009 секунды и 62 запросов к базе данных! DB time is:0,001589! DB connect time is: 0,001
Хотя у самого лысый WP стоит
вы бы лучше полезное что-то сделали
всё никак не могу найти время нарисовать шаблон и вести уже этот чёртов блог=)
По моим прикидкам, они имеют с этого сайта, ну максимум тысячи 3 в месяц РУБЛЕЙ. Как-то это странно, учитывая, что их ценник от $40/час.Карму нам тут конечно изрядно сливают за каждый ответ, но все-таки на это ответим.
Немного не адекватный ход, как мне кажется.
Не, я бы точно постыдился ЭТО ставить в профильА мы не стыдимся своей истории:)
Я бы на вашем месте не стал оправдыватьсяМы не оправдываемся, мы просто объяснили свою позицию. Поскольку нам показалось исходя из хода диалога, что она не вполне ясна. Ну а здесь все же солидный ресурс, поэтому посчитали нужным объяснить ее более развернуто. Каждый волен согласиться с ней или нет и мы ее ни в коем случае никому не навязываем.
… (8 назад мы не 40 стоили)...
просто убрал ссылку на злосчастный сайт из своего профиляЭто мы уже проходили на других ресурсах:)
Любому программисту, который в будущем видит себя программистом, не стоит полагаться на такие решения.
Любому программисту, который в будущем видит себя программистом
Но информации по этому классу будет значительно меньше, чем по «чистым» регулярным выражениям
А кто возьмет линейку, если под рукой штангенциркуль?
Мне кажется, что регулярные выражения — более мощный аппарат, чем эта поделка.
*, +, (a|z), [a-z] и т.д.? Сложности начинаются тогда, когда возникают условные, вложенные и вообще сложные выражения, которые многие ещё и норовят записать в одну строчку.(?:[^()]|(?<b>\()|(?<-b>\)))+(?(b)(?!))(?:
[^()]
|
(?<brackets> \( )
|
(?<-brackets> \) )
)+
(?(brackets)(?!))
VerEx
.OneOrMore(
VerEx
.NoncapturingGroup(
VerEx
.AnythingExcept("()")
.Or(
VerEx
.NamedGroup(
"brackets",
VerEx.Literal("(")
)
)
.Or(
VerEx
.BalancingNamedGroup(
null,
"brackets",
VerEx.Literal(")")
)
)
)
)
.Then(
VerEx
.NamedAlternation(
"brackets"
VerEx
.ZeroWidthNegativeLookahead(
VerEx.Nothing()
)
)
)
Мне кажется, что регулярные выражения — более мощный аппарат, чем эта поделка.А мне кажется, что JavaScript — более мощный аппарат, чем поделки типа jQuery
$scheme = ...
$userinfo = ...
$ipv4 = ...
$ipv6 = ...
$reg_name = ...
$host = "($ipv4)|($ipv6)|($reg_name)"
$authority = "($userinfo)@($host):\d+"
$path = ...
$query = ...
$fragment = ...
$url = "($scheme)://($authority)($path)($query)($fragment)"
если Вы — профессионал в использовании регулярных выражений,
но даже они могут согласиться, что таким способом гораздо легче описать несложное (пока, прим. пер.) регулярное выражение.
А что, для того что бы использовать регулярные выражения, нужно быть профессионалом? По-моему, это уровень джуниора.Что бы использовать всё что угодно — неплохо бы быть в этом профессионалом:)
А что, для того что бы использовать регулярные выражения, нужно быть профессионалом? По-моему, это уровень джуниора.Угу. То-то Джеффри Фриддл томик на 500 страниц написал.
P.S: кошмар какой...... var tester = VerEx()
.startOfLine()
.then( "http" )
.maybe( "s" )
.then( "://" )
.maybe( "www." )
.anythingBut( " " )
.endOfLine();
https?://(www)?[^\s]*$
А отрицания классов символов не пишутся через [^]
\d или \s), а для инвертированных классов — в верхнем (\S, \D).[^\d\s], но не как [\D\S]. Второй вариант вообще не имеет смысла: поскольку цифра не является пробельным символом, а пробел — цифрой, этот класс будет работать так же, как спецсимвол «точка», то есть сопоставляться с любым символом.
/
(?(DEFINE)
(?<addr_spec> (?&local_part) @ (?&domain) )
(?<local_part> (?&dot_atom) | (?"ed_string) | (?&obs_local_part) )
(?<domain> (?&dot_atom) | (?&domain_literal) | (?&obs_domain) )
(?<domain_literal> (?&CFWS)? \[ (?: (?&FWS)? (?&dtext) )* (?&FWS)? \] (?&CFWS)? )
(?<dtext> [\x21-\x5a] | [\x5e-\x7e] | (?&obs_dtext) )
(?<quoted_pair> \\ (?: (?&VCHAR) | (?&WSP) ) | (?&obs_qp) )
(?<dot_atom> (?&CFWS)? (?&dot_atom_text) (?&CFWS)? )
(?<dot_atom_text> (?&atext) (?: \. (?&atext) )* )
(?<atext> [a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+ )
(?<atom> (?&CFWS)? (?&atext) (?&CFWS)? )
(?<word> (?&atom) | (?"ed_string) )
(?<quoted_string> (?&CFWS)? " (?: (?&FWS)? (?&qcontent) )* (?&FWS)? " (?&CFWS)? )
(?<qcontent> (?&qtext) | (?"ed_pair) )
(?<qtext> \x21 | [\x23-\x5b] | [\x5d-\x7e] | (?&obs_qtext) )
# comments and whitespace
(?<FWS> (?: (?&WSP)* \r\n )? (?&WSP)+ | (?&obs_FWS) )
(?<CFWS> (?: (?&FWS)? (?&comment) )+ (?&FWS)? | (?&FWS) )
(?<comment> \( (?: (?&FWS)? (?&ccontent) )* (?&FWS)? \) )
(?<ccontent> (?&ctext) | (?"ed_pair) | (?&comment) )
(?<ctext> [\x21-\x27] | [\x2a-\x5b] | [\x5d-\x7e] | (?&obs_ctext) )
# obsolete tokens
(?<obs_domain> (?&atom) (?: \. (?&atom) )* )
(?<obs_local_part> (?&word) (?: \. (?&word) )* )
(?<obs_dtext> (?&obs_NO_WS_CTL) | (?"ed_pair) )
(?<obs_qp> \\ (?: \x00 | (?&obs_NO_WS_CTL) | \n | \r ) )
(?<obs_FWS> (?&WSP)+ (?: \r\n (?&WSP)+ )* )
(?<obs_ctext> (?&obs_NO_WS_CTL) )
(?<obs_qtext> (?&obs_NO_WS_CTL) )
(?<obs_NO_WS_CTL> [\x01-\x08] | \x0b | \x0c | [\x0e-\x1f] | \x7f )
# character class definitions
(?<VCHAR> [\x21-\x7E] )
(?<WSP> [ \t] )
)
^(?&addr_spec)$
/x
#define W while
int M=136,S=128,I=8e3,C=799,Q,O,K,N;
char L,*P,
w[]={0,1,1,-1,3,3,5,9},
o[]={-16,-15,-17,0,1,16,0,1,16,15,17,0,14,18,31,33,0,7,-1,6,11,8,3,6,6,4,5,7,3,5,4,6},
b[129],
n[]=".?+knbrq?*?KNBRQ",
c[9];
D(k,q,l,e,E,z,n)
int k,q,l,e,E,z,n;
{
int j,r,m,v,d,h,i,F,G,s;
char t,p,u,x,y,X,Y,H,B;
q--;
d=X=Y=0;
W(d++<n||
z==8&K==I&&(N<1e6&d<98||
(K=X,L=Y&~M,d=2)))
{x=B=X;
h=Y&S;
m=d>1?-I:e;
N++;
do{u=b[x];
if(u&k)
{r=p=u&7;
j=o[p+16];
W(r=p>2&r<0?-r:-o[++j])
{A:
y=x;F=G=S;
do{
H=y=h?Y^h:y+r;
if(y&M)break;
m=E-S&&b[E]&&y-E<2&E-y<2?I:m;
if(p<3&y==E)H^=16;
t=b[H];if(t&k|p<3&!(y-x&7)-!t)break;
i=99*w[t&7];
m=i<0?I:m;
if(m>=l)goto C;
if(s=d-(y!=z))
{v=p<6?b[x+8]-b[y+8]:0;
b[G]=b[H]=b[x]=0;b[y]=u|32;
if(!(G&M))b[F]=k+6,v+=30;
if(p<3)
{v-=9*((x-2&M||b[x-2]-u)+
(x+2&M||b[x+2]-u)-1);
if(y+r+1&S)b[y]|=7,i+=C;
}
v=-D(24-k,-l,m>q?-m:-q,-e-v-i,F,y,s);
if(K-I)
{if(v+I&&x==K&y==L&z==8)
{Q=-e-i;O=F;
if(b[y]-u&7&&P-c>5)b[y]-=c[4]&3;
return l;
}v=m;
}
b[G]=k+6;b[F]=b[y]=0;b[x]=u;b[H]=t;
if(v>m)
m=v,X=x,Y=y|S&F;
if(h){h=0;goto A;}
}
if(x+r-y|u&32|
p>2&(p-3|j-7||
b[G=x+3^r>>1&7]-k-6
||b[G^1]|b[G^2])
)t+=p<5;
else F=y;
}W(!t);
}}}W((x=x+9&~M)-B);
C:if(m>I-M|m<M-I)d=98;
m=m+I?m:-D(24-k,-I,I,0,S,S,1);
}
return m+=m<e;
}
main()
{
int k=8;
K=8;W(K--)
{b[K]=(b[K+112]=o[K+24]+8)+8;b[K+16]=18;b[K+96]=9;
L=8;W(L--)b[16*L+K+8]=(K-4)*(K-4)+(L-3.5)*(L-3.5);
}
W(1)
{N=-1;W(++N<121)
printf(" %c",N&8&&(N+=7)?10:n[b[N]&15]);
P=c;W((*P++=getchar())>10);
K=I;
if(*c-10)K=*c-16*c[1]+C,L=c[2]-16*c[3]+C;
k^=D(k,-I,I,Q,O,8,2)-I?0:24;
}
}
.startOfLine() хуже, чем символ ^, потому что задача «уменьшить количество кода», а потом вам однобуквенные переменные не нравятся.
Хватит писать регулярные выражения. Используйте вербальные выражения