如何创建匹配(p,s)精度和缩放的正则表达式,如SQL十进制类型?

时间:2016-04-07 01:28:29

标签: javascript regex

精度(p):小数点左侧和右侧的总位数

比例:小数点右侧的总位数

到目前为止考虑我的以下正则表达式:

GameView
  • - ?可选的负数
  • [0-9]匹配数字0-9
  • “+”任意位数
  • “(\。[0-9] {1,3})?”可选小数,1-3位数

示例:

^-?[0-9]+(\.[0-9]{1,3})?$

我知道如何限制左边的总数和右边的总数,但不知道如何封装整个值来限制“p,precision”部分,如果它存在于该计数中则忽略该句点。 - 也需要在总计数中被忽略。

更新

这似乎有效......

100.95 has a precision of 5 and a scale of 2 (5,2)

4 个答案:

答案 0 :(得分:1)

您可以在开头使用lookahead assertion来验证字符串中的数字是否与您需要的数字完全相同。

(?=(\D*\d\D*){5}$)

这将使你的整个表达成为:

(?=(\D*\d\D*){5}$)^-?[0-9]+(\.[0-9]{1,3})?$

(我使用shorthand character classes \d(数字)和\D(非数字)以简化和IMO可读性。)

它匹配数字\d,可能包含我们不关心的非数字字符\D*,并确保在{{1}之前恰好匹配{5}五次结束字符串。

Refiddle demo here

更新

以下是您确定的表达方式,通过一些调整进行了简化:

$

^(?=(\D*\d\D*){0,5}$)-?\d*(\.\d{0,2})?$ \d相同,因此您可以删除一些冗余。

  • [0-9]可能真的只是([\d0-9]+)?(不确定你是否真的使用了捕获组,在这种情况下你应该在它周围留下括号:\d*
  • (\d*)不需要\.?,因为它可以跟随0位数,而它所在的群组已经有?
  • ?可以是[\d0-9]{0,2}

Refiddle demo of updated expression here

答案 1 :(得分:0)

作为先前答案的补充,也使用前瞻。要限制整数中的总位数,可以使用(?=(?:-?[\.0-9]{3,8}$)|(?:-?[0-9]{1,7}$))。 3表示至少1个精度,需要1个刻度(小数点为3); 7表示整数,精度为7。

可能需要处理轻微的边缘情况。

请参阅RegEx101

答案 2 :(得分:0)

如果要限制“p,precision”部分(例如,您希望将精度限制为5),您可以这样做:

^-?(\d{5}|\d{2}(?=\d*\.\d*)[\d.]{3}\d)$

^               # match start of line
-?              # match - literally; zero or one time
(               # capturing group starts
\d{5}|          # match 5 digits (such as, 10095); OR
\d{2}           # match 2 digits; assert at least 2 digits ahead of dot (.)
(?=\d*\.\d*)    # positive lookahead; assert . (dot) can be matched ahead
[\d.]{3}        # match a digit or . (dot) three times
\d              # assert at least one digit at the end
)               # capturing group ends
$               # match end of line

REGEX 101 DEMO

答案 3 :(得分:0)

当使用类型numeric(<precision>[,<scale>]) note numeric and decimal are synonyms)时,SQL Server实际上在小数点的左侧和右侧存储了固定数量的空格。

因此,对于以下类型:numeric(5,2)

  • SQL最多将 2 位分配给小数点的
  • SQL在小数点的处最多分配5-2 = 3 个数字

含义1234.11234.10类似,并且无效!

-- Will throw an Arithmetic Overflow Exception
DECLARE @Price AS NUMERIC(5,2) = 1234.1

因此,用于验证此结果的正则表达式比此处的某些示例更简单

查找数字\d,您可以使用0到3个数字{0,3}
然后可以选择?,您可以使用句点\.,然后再输入0到2个数字\d{0,2}

整个正则表达式应如下所示:

\d{0,3}(\.\d{0,2})?

进一步阅读