【问题标题】:Regex for Matching Input like "abc > 10, cba < 100, ..." for Pattern in HTML Input用于匹配输入的正则表达式,例如 HTML 输入中的模式的“abc > 10, cba < 100, ...”
【发布时间】:2019-11-25 02:01:50
【问题描述】:

我在 HTML 文档中有一个输入字段。除了 abc > 10, a1 = 20, .. 等格式的输入之外,它不应接受任何输入。

我尝试了各种方法。我能想出的最接近的模式是 ([A-Za-z0-9]+\s[=!==]{1,2}\s[A-Za-z0-9] +[, ]{0,1})+ 。但是,使用此模式,输入字段也可以接受格式为 abc > 10a1 10,a1

我如何编写一个正则表达式,以确保在两个或多个语句(如 abc > 10、a1 = 20)之间总是有一个逗号和单个空格字符分隔这些语句,如果只有一个语句那么最后就不需要逗号了吗?

谢谢

【问题讨论】:

  • , 是逗号,而不是分号。你的意思是;
  • 是的,我的意思是逗号。感谢您指出这一点。

标签: javascript html regex input


【解决方案1】:

以下正则表达式首先测试一个不带逗号的条目,然后测试零个或多个带逗号的条目。

^[A-Za-z0-9]+ [>|<]=? \d+(, [A-Za-z0-9]+ [>|<]=? \d+)*$

结构是:

^ : begins with
[A-Za-z0-9]+ : one or more combination of numbers or letters
[>|<] : one of either < or >
=? : zero or one occurrence of =
\d+ : one or more numbers
(, pattern)* : zero or more occurences of the same pattern but starting with a comma
$ : ends with

为了适应十进制数:

Za-z0-9]+ [>|<]=? \d+(\.\d+)?(, [A-Za-z0-9]+ [>|<]=? \d+(\.\d+)?)*$

相关部分是:

\d+(\.\d+)?

这表示一个或多个数字以及可选的由句点加上一个或多个数字组成的组。分组可确保如果您有点,则在它后面也至少有一位数字。

\d+\.?\d+ 的问题是,您只是将句点设为可选,但现在您需要至少一位数字 两次,这将生成一个像 5 之类的数字strong> 这部分失败了。

【讨论】:

  • 这正是我想要的。只是想知道,如果我也想容纳十进制数字,而不仅仅是数字,这是正确的方法吗? ^[A-Za-z0-9]+ [>||
  • 我看到 \d+\.?\d+ 的问题是,你说的是零或一个点,但右边的 \d+ 仍然需要至少一个数字。如果你只有 \d+\d+ 你可以看到一个数字会失败。相反,您想用一个额外的数字对点进行分组,如下所示:(\.\d+)?我将在答案中添加一个编辑。
  • 编辑了答案并试图解释得更好一点,希望对您有所帮助!
【解决方案2】:

方法一

我猜,也许

^(?:[a-z0-9]+\s*[=<>]{1,2}\s*\d+\s*,\s*)+(?:[a-z0-9]+\s*[=<>]{1,2}\s*\d+\s*)$

可能与您的想法很接近。

RegEx Demo 1


方法二

一个更受限制的版本是,

^(?:[a-z0-9]+\s*(?:>|<|<=|>=)\s*\d+\s*,\s*)+(?:[a-z0-9]+\s*(?:>|<|<=|>=)\s*\d+\s*)$

RegEx Demo 2


方法3

如果你想添加其他比较运算符,你可以修改表达式:

^(?:[a-z0-9]+\s*(?:>|<|<=|>=|={1,3})\s*\d+\s*,\s*)+(?:[a-z0-9]+\s*(?:>|<|<=|>=|={1,3})\s*\d+\s*)$

RegEx Demo 3

正则表达式电路

jex.im 可视化正则表达式:

【讨论】:

    【解决方案3】:

    你的模式 90% 好!唯一的错误是末尾的[, ]{0,1}

    我认为您的意思是 0 or 1 occurence of 'a comma then a space',但 [, ]{0,1} 实际上是指 a comma, a space, or none

    您可以使用(, ){0,1},可以简化为(, )?,它可以工作;)

    还要确保用^$ 包围您的正则表达式,否则它会匹配错误的输入,因为它会匹配输入的部分内容。您想根据整个输入检查匹配。

    【讨论】:

      【解决方案4】:

      您可以更改您的正则表达式以查找一个或多个表达式,每个表达式后有一个尾随逗号和空格或字符串结尾:

      let str = ['abc > 10, a1 < 100, a2 >= 20',
      'abc > 10a1 < 10',
      'abc > 10,a1 < 100'];
      
      str.map(s => console.log(s + ' is ' + (s.match(/^([a-z][a-z0-9]+\s*([><]=?|[!=]=)\s*\d+(, |$))+$/i) ? '' : 'not ') + 'ok'));

      请注意,我已将您的正则表达式中查找运算符的部分更正为

      ([><]=?|[!=]=)
      

      将匹配 &lt;&lt;=&gt;&gt;=!===

      我还假设您希望变量以字母而不是数字开头,所以我将变量作为正则表达式的一部分

      [a-z][a-z0-9]+
      

      如果您对变量以数字开头感到满意,则可以删除 [a-z] 部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-01
        • 1970-01-01
        相关资源
        最近更新 更多