Regex Help, Как сделать так, чтобы порядок выражений не имел значения? - PullRequest
2 голосов
/ 12 февраля 2010

Я не могу понять, как получить порядок входящих параметров строки (цена, продавец, категория) не имеет значения для регулярного выражения. Мое регулярное выражение соответствует частям строки, но не строке в целом. Мне нужно иметь возможность добавить \ A \ Z к нему.

Pattern: 
 (,?price:(;?(((\d+(\.\d+)?)|min)-((\d+(\.\d+)?)|max))|\d+)+){0,1}(,?merchant:\d+){0,1}(,?category:\d+){0,1}

Sample Strings:

price:1.00-max;3-12;23.34-12.19,category:3

merchant:25,price:1.00-max;3-12;23.34-12.19,category:3

price:1.00-max;3-12;23.34-12.19,category:3,merchant:25

category:3,price:1.00-max;3-12;23.34-12.19,merchant:25

Примечание: Я собираюсь добавить ?: ко всем своим группам после того, как все заработает.

Ответы [ 4 ]

3 голосов
/ 12 февраля 2010

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

Если вы сделаете это с помощью регулярных выражений, вам, вероятно, придется в конечном итоге сказать «эта комбинация ИЛИ эта комбинация ИЛИ эта комбинация», что будет очень больно.

2 голосов
/ 12 февраля 2010

У вас есть три варианта:

  1. Вы можете перечислить все возможные заказы. Для 3 переменных есть 6 возможностей. Очевидно, это не масштабируется;
  2. Вы можете принять возможные дубликаты; или
  3. Вы можете разбить строку и затем проанализировать ее.

(2) означает что-то вроде:

/(\b(price|category|merchant)=(...).*?)*/

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

Чтобы добраться до этого, вам нужно добавить «память», обычно в виде стека, в результате чего получается КПК (автомат нажатия).

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

В основном вы принимаете некоторые граничные условия (например, повторяющиеся значения), разделяете строку запятыми, а затем анализируете, или вы просто используете неправильный инструмент для задания.

0 голосов
/ 12 февраля 2010
$string=<<<EOF
price:1.00-max;3-12;23.34-12.19,category:3

merchant:25,price:1.00-max;3-12;23.34-12.19,category:3

price:1.00-max;3-12;23.34-12.19,category:3,merchant:25

category:3,price:1.00-max;3-12;23.34-12.19,merchant:25
EOF;

$s = preg_replace("/\n+/",",",$string);
$s = explode(",",$s);
print_r($s);

выход

$ php test.php
Array
(
    [0] => price:1.00-max;3-12;23.34-12.19
    [1] => category:3
    [2] => merchant:25
    [3] => price:1.00-max;3-12;23.34-12.19
    [4] => category:3
    [5] => price:1.00-max;3-12;23.34-12.19
    [6] => category:3
    [7] => merchant:25
    [8] => category:3
    [9] => price:1.00-max;3-12;23.34-12.19
    [10] => merchant:25
)
0 голосов
/ 12 февраля 2010

Как насчет того, чтобы не пытаться делать все это одним ктулхугексом?

/price:([^,]*)/
/merchant:([^,]*)/
/category:([^,]*)/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...