我需要一些帮助。
我必须为 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