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



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

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

123.34 
12345.56
2.54

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

12.43
123.32 2345.54
124.43

此示例无效,因为一个金额不包含 2 位小数(每个金额必须正好有 2 位小数(:

123
123.43
123.65

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

谢谢

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

^(([^Srn]*[0-9]+[.][0-9]{2}[^Srn]*)n)*(([^Srn]*[0-9]+[.][0-9]{2}[^Srn]*))$

实际上,它的作用是确保最后一行(末尾没有换行符(始终存在,但也允许在以换行符 (( 结尾的行之前使用可选行。

我们还使用 [^Srn] 部分代替 s 来确保它检查除换行符之外的空格字符,因为换行符会导致在同一行上验证多个值时出现问题。

这是一个工作示例

您可以使用

ng-pattern="/^[^Srn]*d+.d{2}(?:[^Srn]*r?n[^Srn]*d+.d{2})*[^Srn]*$/"

请参阅正则表达式演示。

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

ng-pattern="/^d+.d{2}(?:[^Srn]*r?n[^Srn]*d+.d{2})*$/"

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

图案详细信息

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

添加多行标志/m以便能够将^锚定到每行的开头

/^([0-9]+[.][0-9]{2})s*$/gm

例如 https://regex101.com/r/XMTSok/4

问题是s匹配也空格使用[rn]来匹配换行符和回车符。

编辑我R提到的第一篇文章,但它是特定于 PCRE 的。

编辑以下注释以接受行尾的空格

^(([0-9]+[.][0-9]{2}) *(?:r?n|$))+$

正则表达式101

最新更新