我需要验证货币字符串如下:
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以匹配满足上述要求的货币?
互联网上的其他一些问题与我的要求不符。
答案 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}$
要在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