你能修复这个Java Regex以匹配-10 USD,12.35 AUD ...(Java)这样的货币吗?

时间:2014-02-16 02:09:13

标签: java regex

我需要验证货币字符串如下:

 1. The Currency Unit must be in Uppercase and must contain 3 characters from A to Z
 2. The number can contain negative (-) or positive (+) sign.
 3. The number can contain the decimal fraction, but if the number contain 
the decimal fraction then the fraction must be 2 Decimal only.
 4. There is no space in the number part

所以看看这个例子:

10 USD ------> match
+10 USD ------> match
-10 USD ------> match
10.23 AUD ------> match
-12.11 FRC ------> match
- 11.11 USD ------> NOT match because there is space between negative sign and the number
10  AUD ------> NOT match because there is 2 spaces between the number and currency unit
135.1 AUD ------> NOT match because there is only 1 Decimal in the fraction
126.33 YE ------> NOT match because the currency unit must contain 3 Uppercase characters 

所以这就是我尝试但失败的

if(text != null && text.matches("^[+-]\\d+[\\.\\d{2}] [A-Z]{3}$")){     
  return true;
}

"^\\d+ [A-Z]{3}$"匹配号,没有任何符号和小数部分。

那么您能否修复此Java Regex以匹配满足上述要求的货币?

互联网上的其他一些问题与我的要求不符。

4 个答案:

答案 0 :(得分:3)

似乎你不知道?量词,这意味着这个量词描述的元素可以出现零次或一次,使其成为可选的。

所以说,字符串在开始时可以包含可选的-+,只需添加[-+]?
要说它可以包含.XX形式的可选小数部分,其中X为数字,只需添加(\\.\\d{2})?

请尝试使用"^[-+]?\\d+(\\.\\d{2})? [A-Z]{3}$"


BTW如果您使用yourString.matches(regex),则无需向正则表达式添加^$。只有当整个字符串与正则表达式匹配时,此方法才匹配,因此不需要这些元字符。

BTW2通常您应该在字符类-中转义[...],因为它代表[A-Z]之类的字符范围,但在这种情况下-不能以这种方式使用,因为它位于字符类的开头,因此没有“第一个”范围字符,因此您不必在此处转义-。如果-[..-]中的最后一个字符,则同样如此。在这里它也不能代表范围所以它是简单的文字。

答案 1 :(得分:1)

你可以用

开始你的正则表达式
^(\\+|\\-)? 

这意味着它会在数字前接受一个+符号,一个-符号或者根本不接受任何内容。但这只是你的一个问题。

现在是小数点:

“3.数字可以包含小数,但如果数字包含 小数部分则分数必须仅为2十进制。“

所以在数字\\d+之后,下一部分应该在( )?中以表明它是可选的(意味着1次或从不)。所以要么完全一个点,两个数字或没有

(\\.\\d{2})?

Here you can find a reference for regex and test them。只需看看你可以用什么来识别货币的3个字母。例如。 \s可以帮助您识别空白

答案 2 :(得分:1)

尝试:

text.matches("[+-]?\\d+(\\.\\d\\d)? [A-Z]{3}")

请注意,由于您使用.matches(),正则表达式会自动锚定(因此责怪Java API desingers:.matches()被错误地命名)

答案 3 :(得分:1)

这将符合您的所有情况:

^[-+]?\d+(\.\d{2})?\s[A-Z]{3}$

Demo @ regex101

要在Java中使用它,您必须转义\

text.matches("^[-+]?\\d+(\\.\\d{2})?\\s[A-Z]{3}$")

你的正则表达式离目标不远,但它包含几个错误 最重要的一个是:[]表示character class()表示capturing group。因此,当您指定[\\.\\d{2}]之类的字符组时,它将匹配字符\.d{2},但您希望匹配模式.\d{2} 其他答案已经教你? quantifier,所以我不再重复了。

旁注:regular-expressions.info是了解这些事情的重要来源!

上面使用的正则表达式的说明:

^           #start of the string/line
  [-+]?     #optionally a - or a + (but not both; only one character)
  \d+       #one or more numbers
  (         #start of optional capturing group
    \.\d{2} #the character . followed by exactly two numbers (everything optional)
  )?        #end of optional capturing group
  \s        #a whitespace
  [A-Z]{3}  #three characters in the range from A-Z (no lowercase)
$           #end of the string/line