Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Добавить условия в строку рег. выражения


Автор: NickG 12.7.2007, 18:29
Вопрос вот в чем..
правило для обработки строки(java regex) формируется с помощью мастера...
ну к примеру:
нужная строка начинается с такой-то строки и заканчивается на такую-то -
начало.*конец  (выберет строку между этими двумя)

как теперь к данному рег. выражению добавить условия типа строка содержит такие-то символы или не содержит?

Автор: shamber 12.7.2007, 23:29
NickG, (java regex)
вы точно веткой форума не ошиблись?

Автор: NickG 13.7.2007, 00:09
нет smile
ну так как бы это было на perl?
просто:
а) регулярные выражения  - это стихия perl(а)
б) ява в этом плане похожа на перл сильно или я не прав?
в) очень специфическая тема

Автор: Nab 13.7.2007, 00:24
Тогда, NickG, давайте конкретно, показуйте примеры своих строк и подробненько что должно получиться...

Автор: NickG 13.7.2007, 00:43
о_О
ну к примеру:
есть строка "1 н2 3 б4 а5 6"
мне нужно одним регулярным выражением пройти такие условия:
1)данная строка начинается на "н2" и заканчивается на "а5" 
2) данная строка имеет подстроку к примеру "н2"
3) данная строка не содержит строку "к10"
и в результате я получаю "н2 3 б4 а5"

я так понял мне нужно логическое И реализованное не языком программирования, а в регулярном выражении

Автор: NickG 13.7.2007, 00:59
хотя, хотя..... можно вставить в рег. выражение какие-то свои символы разделения.... (И)...
и потом при обработке делить строку с выражением на части... но все же одной строкой - конечный результат

Автор: amg 13.7.2007, 09:46
NickG, все равно не совсем понятно, что нужно (А., Б. или В.). Начнем с того, что переформулируем условие 2)  на
2) данная строка имеет подстроку к примеру "б4"
т.к. в твоей формулировке оно просто лишнее. 

А. Проверить строки на соответствие условию 1) И 2) И 3)
Код

foreach ("1 н2 3 б4 а5 6", "н2 3 б4 а5") {
  if (/^н2.*а5$/ && /н2/ && !/к10/) {
    print 'match';
  } else {
    print 'no match';
  }
}
В перле есть возможность сделать такой код компактным и понятным (благодаря наличию магической неявной переменной $_), и никому даже в голову не придет вносить все условия в одно регулярное выражение: в данном случае это легко сделать, но получается, мягко говоря, не внятно (см. далее).
Кстати, будет еще понятнее (и быстрее работать), если разбить условие 1) на два: 
Код

/^н2/ && /а5$/ && /н2/ && !/к10/

Б. В строке выделить подстроку, удовлетворяющую условию 1) И 2) И 3)
Вот здесь составление сложного регулярного выражения, включаюшего все условия, IMHO, оправдано.
Код

if (/(н2(?:(?<!к10).(?!к10))*?б4(?:(?<!к10).(?!к10))*?а5)/) {
  print $1;
}

В. Из строки убрать лишнее, чтобы получилась строка, удовлетворяющую условию 1) И 2) И 3)
Не вижу способа сделать это одним регулярным выражением

Автор: nitr 13.7.2007, 12:20
NickG, если вы так и будете "задавать вопрос не по существу - тем более по правилам форума ("сути нет")", то вам не помогут, здесь не телепатируют ;) А ещё могут посоветовать учить "матчасть"/RTFM и т.д.

Вы более точнее укажите - что у вас не получается, что необходимо сделать.
Так как, то что вы тут пишите - это невопрос, это больше смахивает на "обучение". Так google.com, Библиотеки. Азы составления "регулярных выражений" описаны ОЧЕНЬ ДОСТУПНО!!!

Автор: Nab 13.7.2007, 16:22
amg,  верно написал, я скажу немного по другому, одновременное утверждение что должно быть, и чего не должно быть, в одной регулярке можно реализовать, но достаточно сложно....
лучше это делать через две регулярки
Код

$str = "1 н2 3 б4 а5 6";
if ($str =~ /(н2.*?a5)/ and $1 !~ /k10/) {print $1 }

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

И как сказал nitr, вам бы немного подучиться потому что н2 в вашем случае не начало строки, а начало подстроки, вы сильно путаете терминологию и запутываете отвечающих... И вообще рекомендую вдуматься в мою подпись...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)