【问题标题】:Regex to validate entire multiline text in angularjs正则表达式验证 angularjs 中的整个多行文本
【发布时间】:2018-07-12 18:02:37
【问题描述】:

我需要一些帮助。
我必须为 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*)+$,它可以测试here。但我的正则表达式还不够,因为它在同一行中接受多个金额的文本。

谢谢

【问题讨论】:

标签: javascript angularjs regex validation


【解决方案1】:

问题在于\s 匹配也使用[\r\n] 来匹配换行符和回车符。

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

编辑以下 cmets 以在行尾也接受空格

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

regex101

【讨论】:

  • 这似乎无法验证整个文本。例如,在无效数字的末尾添加一个新行,如12.3... 整个事情应该是不匹配的。此外,OP 也希望在行首接受空格
  • 已修复,最后一个$在移入交替后被错误删除
【解决方案2】:

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

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

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

【讨论】:

  • 如果还想要前导空格,您也可以在前面使用\s*,因为拥有修饰符/标志/m 无论如何都会使其成为多行
  • 这不会根据要求将输入验证为单个文本块
【解决方案3】:

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

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

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

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

Here is a working example

【讨论】:

  • 如果一行包含制表符 (\t),则不会验证输入。除此之外,它是满足我需求的一个很好的正则表达式。谢谢
  • @GryphG:虽然你没有在你的问题中提到这一点......那么,它是空格和制表符吗?或者你还没有提到的其他东西?我已经更新了支持标签的答案
  • 那是我的错误。现在我提到了一切。
  • [ \t] 仍然与许多其他水平空格(如硬空格)不匹配。此外,与量化更接近$ 的右侧部分相比,量化左侧部分会使正则表达式的性能稍差。
  • @WiktorStribiżew:OP 只要求空格,然后是制表符。 OP 现在评论说只有这两个要求
【解决方案4】:

你可以使用

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

请参阅regex demo

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

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

或者,如果您想确保在开始/结束处没有空行,请使用带有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+ 个水平空格
  • $ - 字符串结束。

【讨论】:

    猜你喜欢
    • 2016-08-24
    • 1970-01-01
    • 2011-10-29
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多