2012-02-23 1 views
0

Как я могу соответствовать именам в массиве, например, как этот:Как соответствовать элементам массива с регулярным выражением

[молоко, тыквенный пирог, яйцо, сок]

Он также должен поддерживать отдельные элементы в массивах. Это работает, но сбой Reggy (программа регулярных выражений), вероятно, потому, что постоянные образы - это напряжение.

([^,\[\]]+(?=,|\s*\])) 

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

EDIT:

Я получил: (?<=\[)([^\[\]]+)(?=,|\]), который соответствует детали и запятые.

+0

почему вы не используете '([^ \ [\] \ s] +)'? Пространство особенное? –

+0

Это будет соответствовать любому персонажу, который не находится в этом классе char, я не хочу, чтобы он соответствовал окружающему тексту –

+0

Вы имеете в виду, что у вас есть ** строка **, такая как «[молоко, тыквенный пирог, яйца, сок») "и вы хотите получить имя без' ['и', '. – steveyang

ответ

1

Для всего, что я могу сказать (и я попытался использовать Python и его встроенные регулярные выражения), нет ничего плохого в вашем регулярном выражении. Если это вызвало ошибку Reggy, это, вероятно, ошибка, и она должна сообщаться как таковая.

Однако следует заметить, что ваше регулярное выражение, избегая появления запятых и скобок внутри совпадений, включает пробелы между запятой и началом элемента. Например, вы получите «тыквенный пирог» (обратите внимание на ведущее пространство), а не «тыквенный пирог» в матче. Я не вижу прямого способа избежать этого.

Один из способов, но, возможно, не поддерживается Reggy, заключается в использовании групп для подбора соответствующих частей совпадений. Например, в Python:

import re 
text = '[milk, pumpkin pie, eggs, juice]' 
pattern = re.compile(r'\s*([^,\[\]]+)(?=,|\s*\])') 

for match in pattern.finditer(text): 
    print match.group(1) 

Обратите внимание, как регулярное выражение теперь включает ведущие пробелы (\s+) и круглые скобки вокруг соответствующей части матча: ([^,\[\]]+). В части печати я называю это group(1).

+0

Добавлено примечание: Реджи, похоже, поддерживает группы. См. Примечания к выпуску http://reggyapp.com/release_notes/#1.3 – jogojapan

+0

Спасибо, я не был слишком суетился о пробелах, но ваш вариант тоже работает. –

1

Вот что я хотел бы предложить в .NET: (. Брокен в несколько строк для только ясности)

(?<=\[(?:[^\]]+,\s+)?) // Look behind for the start bracket and possibly previous values 
([^\],]+)    // capture the value until the next comma or end bracket 
(?=,|])    // Look ahead and find a comma or end bracket 

Проблема с использованием варианта в JavaScript из регулярных выражений является отсутствие нулевой ширины положительное утверждение look-behind, которое необходимо, если вы хотите сопоставить более одного элемента массива.

0

Пробег: \b[\w ]+\b.

Это будет соответствовать нескольким словам, позволяющим пробелы между ними ([\w ]+). Поскольку + жадный, он будет соответствовать как можно большему количеству слов, но он не будет перейдет границу запятой или скобки, потому что это не соответствует \w или .

Вы можете поиграть с ним here.

+0

Спасибо, я должен был упомянуть, что текст может быть окружен массивом, который не должен совпадать. –

1

Javascript опережения прекрасно работает, и это не захват запятой/пространства последовательностей:

//only assumption is csv 
    var data = '[milk, pumpkin pie, eggs, juice]'; 
      var myregexp = /[^,]+(?=,\s?|]$)/g; 
      var match = myregexp.exec(data); 
      var result = "matches found:\n"; 
      while (match != null) { 
       //first match will include the [, strip it. 
       result += match[0] + ',\n'; 
       match = myregexp.exec(data); 
      } 
      alert(result); 
+0

К сожалению, это не удается, если есть слово после '[...]', спасибо, хотя –

Смежные вопросы