Можете ли вы помочь мне сделать это регулярное выражение? - PullRequest
2 голосов
/ 14 марта 2009

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

Текстовые строки могут выглядеть так:

Some place
Some place (often text in parenthesis)
Some place (often text in parenthesis) [even text in brackets sometimes]

Мне нужно разделить эти строки на три:

{Some place} ({often text in parenthesis}) [{even text i brackets sometimes}]

Который должен вернуть:

1: Some place
2: often text in parenthesis
3: even text in brackets sometimes

Я знаю, что это должно быть легкой задачей, но я не мог решить правильное регулярное выражение. Это должно быть использовано в PHP.

Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 14 марта 2009

Попробуйте что-то вроде этого:

$result = preg_match('/
  ^ ([^(]+?)
  (\s* \( ([^)]++) \))?
  (\s* \[ ([^\]]++) \])?
  \s*
  $/x', $mystring, $matches);

print_r($matches);

Обратите внимание, что в этом примере вас, вероятно, больше всего интересуют $ match [1], $ match [3] и $ match [5].

1 голос
/ 14 марта 2009

Как то так?

([^(]++)(?: \(([^)]++)\))?(?: \[([^\]]++)\])?
1 голос
/ 14 марта 2009

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

^(.*?)\s+\((.*?)\)\s+\[(.*?)\]\s+$

если не получится, попробуйте:

^(.*?)\s+\((.*?)\)\s+$

, если это также не удается, попробуйте:

^\s+(.*?)\s+$

Я уверен, что их можно объединить в одно регулярное выражение, но я бы не стал пытаться.

1 голос
/ 14 марта 2009

Разделите задачу на три регулярных выражения. После первого, где вы получите каждый символ перед первой скобкой, сохраните свою позицию - такую ​​же, как длина только что извлеченной строки.

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

Получение третьей строки тривиально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...