Regex для захвата нумерованного текстового списка - PullRequest
1 голос
/ 21 марта 2010

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

Вот пример текстового формата:

(1) this is a sample string /(2) something strange /(3) another bit of text /(4) the last one/ something!/

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

Вот мое регулярное выражение

/\(?\d\d?\)([^\)]+)(\/|\z)/

К сожалению, некоторые данные содержат скобкивот так:

(1) this is a sample string (1998-1999) /(2) something strange (blah) /(3) another bit of text /(4) the last one/ something!/

Подстроки '(1998-1999)' и '(бла)' приводят к сбою!

Кто-нибудь хочет иметь трещину в этом?Спасибо: D

Ответы [ 3 ]

1 голос
/ 21 марта 2010

Добавьте / к началу строки, добавьте (0) к концу строки, затем разбейте всю строку с помощью шаблона \/\(\d+\) и отбросьте первый и последний пустые элементы.

1 голос
/ 21 марта 2010

Пока / не может появиться в тексте ...

 \(?\d?\d[^/]+
1 голос
/ 21 марта 2010

Я бы попробовал это:

\((\d+)\)\s+(.*?)(?=/(?:\(\d+\)|\z))

Это довольно страшное регулярное выражение делает следующее:

  • Он ищет одну или несколько цифр в скобках и фиксирует их;
  • Должен быть хотя бы один символ пробела после цифр в скобках. Это пустое пространство игнорируется (не захватывается);
  • Используется не жадное шаблонное выражение. Это (imho) предпочтительный способ использования групп отрицательных символов (например, [^/]+) для такого рода проблем;
  • Позитивный взгляд ((?=...)) говорит, что за выражением должен следовать обратный слеш, а затем один из:
    • одна или несколько цифр в скобках; или
    • терминатор строки.

Чтобы дать вам пример на PHP (вы не указываете свой язык):

$s = '(1) this is a sample string (1998-1999) /(2) something strange (blah) /(3) another bit of text /(4) the last one/ something!/';
preg_match_all('!\((\d+)\)\s+(.*?)(?=/(?:\(\d+\)|\z))!', $s, $matches);
print_r($matches);

Выход:

Array
(
    [0] => Array
        (
            [0] => (1) this is a sample string (1998-1999) 
            [1] => (2) something strange (blah) 
            [2] => (3) another bit of text 
            [3] => (4) the last one/ something!
        )

    [1] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
        )

    [2] => Array
        (
            [0] => this is a sample string (1998-1999) 
            [1] => something strange (blah) 
            [2] => another bit of text 
            [3] => the last one/ something!
        )

)

Некоторые заметки:

  • Вы не указываете, что вы хотите захватить. Я предположил номер пункта списка и текст. Это может быть неправильно, в этом случае просто отбросьте эти круглые скобки. В любом случае вы можете получить весь матч;
  • Я бросил косую черту из матча. Это не может быть вашим намерением. Снова просто измените захват, чтобы удовлетворить;
  • Я допустил любое количество цифр для номера элемента. Ваша версия допускается только две. Если вы предпочитаете это, замените \d+ на \d\d?.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...