@Banny_Boom

Как правильно построить регулярное выражение чтобы находил 1 группу?

{ func(var) and func2(var2) }
или (иногда бывает такой):
{ func(var) }

Вот моя регулярка:
есть строка:
{[\s]*( ([\S]*\(([\S]*)\)) | ([\S]*\(([\S]*)\)[\s]*(and|or)[\s]*([\S]*\(([\S]*)\))) )[\s]*} - тут с пробелами, в коде пробелов нет, для читабельности сделал
preg_match_all


Проблема в том, что в matches ест пустые элементы, вот результат:
строка - { func(var }

результат:
array(9) {
  [0]=>
  array(1) {
    [0]=>
    string(12) "{func(var) }"
  }
  [1]=>
  array(1) {
    [0]=>
    string(9) "func(var)"
  }
  [2]=>
  array(1) {
    [0]=>
    string(9) "func(var)"
  }
  [3]=>
  array(1) {
    [0]=>
    string(3) "var"
  }
  [4]=>
  array(1) {
    [0]=>
    string(0) ""
  }
  [5]=>
  array(1) {
    [0]=>
    string(0) ""
  }
  [6]=>
  array(1) {
    [0]=>
    string(0) ""
  }
  [7]=>
  array(1) {
    [0]=>
    string(0) ""
  }
  [8]=>
  array(1) {
    [0]=>
    string(0) ""
  }
}


Знаю что нужно указать начало строки ^ и конец $, но вставить их более правильно как-то не выходит..
  • Вопрос задан
  • 151 просмотр
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
вторая третья скобки не срабатывают для { func(var) and func2(var2) }, а только для { func(var) }, в свою очередь, остальные не срабатывают для { func(var) }

естественно, будут пустые элементы

проще всего - оперировать с получившимся массивом: выкиньте из него нулевые элементы и получите искомое, кстати о птичках - у вас же в условиях задачи должно быть то пять совпадений, то два - ессно, для "два" еще три будут пустыми

начало/конец строки не для такого монстрокода )

но шоб далеко не ходить и обойтись только шестью скобками, а не восемью, попробуй так:

{[\s]*([\S]*\(([\S]*)\))[\s]*(?:(and|or)[\s]*([\S]*\(([\S]*)\)))?[\s]*}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы