【发布时间】:2016-08-25 11:22:02
【问题描述】:
我需要有关正则表达式 (PHP) 的帮助。所以我有一个文本区域框,用户可以在其中输入订单。
例如:
see north,
see south,
sell 7 wood,
see west
我需要一个符合以下规则的正则表达式:
- 每个订单用逗号分隔,最后一个除外
- 顺序是(见北,见南,见西,见东)或(买/卖 % 木材)。 % - 表示数字(最大值为 999,最小值为 1,没有头零)
到目前为止,我已经做了这个正则表达式:
preg_match("/(((see) (north|south|west|east))|((sell|buy) ([1-9][0-9]{0,2}) (wood)))/");
但问题是,下面的输入也是有效的,应该不是: 出售 75 木材见北(应该是 出售 75 木材 或 见北)
注意!现在我的正则表达式中没有逗号验证,因为我使用 PHP 函数 explode 用逗号分割,然后将结果数组项传递给正则表达式。但它似乎不适用于以下输入:
see north,
see south *(no comma between two orders)*
sell 7 wood,
see west
所以,我需要以下解决方案之一:
- 正则表达式有逗号验证(见规则)
- 我用PHP的explode函数对输入字符串进行了爆炸,限制以下输入无效:sell 75 wood see north
谢谢。
【问题讨论】:
-
四个你的#2 - 使用anchors,比如
^(?:see (?:north|south|west|east)|(?:sell|buy) [1-9][0-9]{0,2} wood)$ -
您没有将模式锚定到测试字符串的开头和结尾 - 因此
see south sell 7 wood给出了肯定的结果,因为单独的see south已经满足了您的 | 连接模式的第一部分。 -
谢谢你,它似乎工作。不过,我需要编写一些单元测试来确保它完成了它应该做的事情。当然,我会更深入地研究正则表达式。感谢您的回答!