美元符号被迫左或右

时间:2015-06-09 17:01:46

标签: regex

我正在学习正则表达式并在regexpal.com上测试我的表达式。到目前为止,这个正则表达式匹配任何小于1000的数字:

  

^ \ d {1,3} $

例如:999匹配。

只有在向左或向右放置$符号时,才会要求我匹配表达式。我不知道该怎么做。所以我想:

通过执行此操作可以检测到右侧的美元符号。例如,999 $匹配:

  

^ \ d {1,3}的 \ $ $

这样做可以检测左边的美元符号。例如$ 999匹配:

  

^的 \ $ \ d {1,3} $

我想,使用运算符,我可以接受左边和右边的$符号:

  

^的(\ $)吗 \ d {1,3}的(\ $)吗 $

这部分解决了问题,正则表达式现在匹配:

  • 999 $
  • $ 999产品

但也匹配:

  • $ $ 999
  • 999

如何修正我的正则表达式强制至少一个美元符号向右或向左(但不是两个)并拒绝一个没有$的数字(我们不能使用字符数9和99和999都匹配)?< / p>

2 个答案:

答案 0 :(得分:5)

您可以采用的方法之一是使用管道|(替代运营商):

^(\$\d{1,3}|\d{1,3}\$)$

请参阅DEMO

答案 1 :(得分:1)

你可以按照你第一次假设的方式进行,使美元符号可选 在两端,但添加一个最多需要1美元符号的断言 剩下的就到位了。

^(?=[^$]*\$[^$]*$)\$?(?:\d|[1-9]\d|[1-9]\d{2})\$?$

 ^ 
 (?= [^$]* \$ [^$]* $ )
 \$? 
 (?:
      \d 
   |  [1-9] \d 
   |  [1-9] \d{2} 
 )
 \$?
 $

或者,它允许在美元金额上领先零,但是如果你想要 这样做,它的..

^(?=[^$]*\$[^$]*$)\$?\d{1,3}\$?$

更短,但允许前导零。

 ^ 
 (?= [^$]* \$ [^$]* $ )
 \$? \d{1,3} \$?
 $