我无法弄清楚如何获取传入字符串参数(价格,商家,类别)的顺序对正则表达式无关紧要。我的正则表达式匹配字符串的部分,但不匹配整个字符串。我需要能够将\ 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
注意:在我开始工作后,我会向我的所有群组添加?:
。
答案 0 :(得分:3)
你应该通过正常的解析来解析这个字符串。用逗号分隔它,然后用冒号将每个部分分成两部分。如果您想单独检查每个输入,可以存储验证正则表达式。
如果你通过正则表达式来做,你可能不得不说“这个组合或这个组合或这个组合”,这将伤害真正的坏。
答案 1 :(得分:2)
您有三种选择:
(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
)