匹配变量项方程

Matching variable-term equations

我正在尝试开发一个正则表达式来匹配以下等式:

(Price+10%+100+200)
(Price+20%+200)
(Price+30%)
(Price+100)

(Price-10%-100-200)
(Price-20%-200)
(Price-30%)
(Price-100)

到目前为止我的正则表达式是...

/([(])+([P])+([r])+([i])+([c])+([e])+([+]|[-]){1}([\d])+([+]|[-])?([\d])+([%])?([)])/g

...,但它只匹配以下等式:

(Price+100+10%)
(Price+100+100)
(Price+200)
(Price-100-10%)
(Price-100-100)
(Price-200)

有人可以帮助我了解如何使我的模式匹配提供的全套方程式吗?

注意:括号和 'Price' 是方程式中必须匹配的模式。

/^[(Price]+\d+\d+([%]|[)])&/i

尝试风险自负!

试试这个,它匹配问题中提供的所有输入字符串:

/\(Price([+-]\d+%?){1,3}\)/g

您可以在 regex fiddle.

中进行测试

注意事项:

  • 只在要分组的地方使用括号。围绕单一可能性、固定数量匹配的括号(例如 ([P]) 不提供任何值。
  • 使用字符 classes(以 [ 开始,以 ] 结束)用于 多个 可以匹配的字符模式(例如 [+-])。单一可能性字符 classes(例如 [P])同样不提供任何值。
  • 是的,字符 classes(通常)在其中隐式转义正则表达式特殊字符(例如 [(] 中的 ( 与字符 [= 外的等效 \( 56=]),但要 just 转义正则表达式特殊字符(即按字面匹配它们),最好不要使用字符 class 并转义它们(例如 \() – 除非多个字符应该在模式中的一个位置匹配(根据前面要注意的一点)。
  • 量词 {1}(几乎)总是没用:放弃它。
  • 如您所知,量词 + 表示 "one or more"。但是,在您使用它的一系列情况下(即 ([(])+([P])+([r])+([i])+([c])+([e])+),它会匹配许多我怀疑您期望的值(例如 ((((((PPPrriiiicccceeeeee):基本上,不要过度使用它。停止考虑您是否真的要匹配 或多个 字符 (class) 或 + 在模式中应用的组。
  • 要匹配没有任何正则表达式特殊字符(如 Price)的文字字符串,只需在模式中的适当位置使用文字字符串 - 例如Price\(Price.

/\(Price[+-](\d)+(%)?([+-]\d+%?)?([+-]\d+%?)?\)/g

适用于 http://www.regexr.com/