正则表达式验证angularjs中的整个多行文本

Gry*_*h G 5 javascript regex validation angularjs

我需要一些帮助.
我必须为angularjs ng-pattern属性构造一个正则表达式.正则表达式必须验证文本,而不是每行或某些部分.文本必须包含一些精确为2位小数的金额,每个金额应输入新行.此外,在每个金额之前和之后接受空格.如果一行包含2个金额,则整个文本无效.

例如,此文本有效,因为每个金额都在新行中输入:

123.34 
12345.56
2.54
Run Code Online (Sandbox Code Playgroud)

此示例无效,因为一行包含2个金额:

12.43
123.32 2345.54
124.43
Run Code Online (Sandbox Code Playgroud)

此示例无效,因为一个金额不包含2个小数(每个金额必须精确为2个小数):

123
123.43
123.65
Run Code Online (Sandbox Code Playgroud)

我最好的尝试是^(([0-9]+[.][0-9]{2})\s*)+$,它可以在这里测试.但是我的正则表达式还不够,因为它接受同一行中多个金额的文本.

谢谢

mus*_*fan 6

正则表达式不是我的强项,所以可能有一个更简单的方法来做到这一点,但这确实符合您的要求:

^(([^\S\r\n]*[0-9]+[.][0-9]{2}[^\S\r\n]*)\n)*(([^\S\r\n]*[0-9]+[.][0-9]{2}[^\S\r\n]*))$
Run Code Online (Sandbox Code Playgroud)

它的作用实际上是确保最后一行(末尾没有换行符)总是存在,但也允许在换行前的可选行以换行符(\n)结束.

我们还使用该[^\S\r\n]部分\s来确保它检查除换行之外的空格字符,因为换行是导致在同一行上验证多个值的问题.

这是一个有效的例子


Wik*_*żew 3

您可以使用

ng-pattern="/^[^\S\r\n]*\d+\.\d{2}(?:[^\S\r\n]*\r?\n[^\S\r\n]*\d+\.\d{2})*[^\S\r\n]*$/"
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

或者,由于默认情况下,角度会在将输入发送到正则表达式引擎之前对其进行修剪(如果您没有ng-trim或有的话ng-trim="true"),您也可以使用

ng-pattern="/^\d+\.\d{2}(?:[^\S\r\n]*\r?\n[^\S\r\n]*\d+\.\d{2})*$/"
Run Code Online (Sandbox Code Playgroud)

或者,如果您想确保开始/结束处没有空行,请使用第一个正则表达式与ng-trim="false".

图案细节

  • ^- 字符串的开头
  • [^\S\r\n]*- 任何 0+ 水平空格
  • \d+- 1 位或多位数字
  • \.- 一个.字符
  • \d{2}- 2 位数字
  • (?:- 非捕获组匹配的开始...
    • [^\S\r\n]*- 任何 0+ 水平空格
    • \r?\n- 换行序列
    • [^\S\r\n]*\d+\.\d{2} - 任何 0+ 水平空白、1+ 数字.和 2 数字
  • )*- ...零次或多次
  • [^\S\r\n]*- 任何 0+ 水平空格
  • $- 字符串末尾。