正则表达式帮助,如何使表达式顺序无关紧要?

时间:2010-02-12 01:45:44

标签: regex

我无法弄清楚如何获取传入字符串参数(价格,商家,类别)的顺序对正则表达式无关紧要。我的正则表达式匹配字符串的部分,但不匹配整个字符串。我需要能够将\ 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 个答案:

答案 0 :(得分:3)

你应该通过正常的解析来解析这个字符串。用逗号分隔它,然后用冒号将每个部分分成两部分。如果您想单独检查每个输入,可以存储验证正则表达式。

如果你通过正则表达式来做,你可能不得不说“这个组合或这个组合或这个组合”,这将伤害真正的坏。

答案 1 :(得分:2)

您有三种选择:

  1. 您可以枚举所有可能的订单。对于3个变量,有6种可能性。显然这不会扩展;
  2. 您可以接受可能的重复;或
  3. 你可以打破字符串,然后解析它。
  4. (2)意思是:

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

    您在这里遇到的真正问题是,您正在尝试使用正则表达式解析本质上非常规的语言。正则表达式描述了DFSM(确定性有限状态机)或DFA(确定性有限自动机)。普通语言没有状态概念,所以表达式不能“记住”其他的东西。

    为此,你必须以堆栈的形式添加一个“内存”,这会产生一个PDA(下推自动机)。

    当他们尝试使用正则表达式解析HTML并遇到标记嵌套问题和类似问题时,人们面临的问题完全相同。

    基本上你接受一些边缘条件(比如重复值),用逗号分割字符串,然后解析或者你只是使用错误的工具来完成工作。

答案 2 :(得分:0)

如果不尝试用一个Cthulhugex来做这一切怎么样?

/price:([^,]*)/
/merchant:([^,]*)/
/category:([^,]*)/

答案 3 :(得分:0)

$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
)