只限制正则表达式的一部分而不是整个表达式本身?
Limit only parts of a Regular Expression not the whole expression itself?
所以我有一个输入字段,客户可以在其中输入长度为 1-10 的数字,并使用至少有 1 个数字作为前缀的通配符。 (* 不允许,而 1* 可以)
可以在字符串中间设置通配符,但表达式的整体最大长度为10。
此时我通过以下表达式收到了这个结果:
^([ ,;]?(?=.{1,10}$)((\d{1,9})(\*?)(\d{0,9}?))[ ,;]?)$
现在是问题。正如您在表达式中看到的,分隔符 SPACE、COMMA 和 SEMI-COLON 允许出现在字符串的开头或结尾,因为客户端可以在该组合中输入多个数字。 [ ,;]?
但他不能,因为最大长度为 10 (?=.{1,10}$)
。
另一方面,如果我删除最大长度限制,那么您可以输入一个超过 10 的数字(现在最多正好是 19 个字符)123456789*123456789
-> 将被允许不受限制。
有什么方法可以限制表达式,分隔符之间的字符长度必须是 10 个绝对最大长度,但总的来说最大长度可以更长以输入更多数字?
也许:
^(?:\d(?=\d*\*?\d*(?:[ ,;]|$))[\d*]{0,9}(?:[ ,;]|$))+$
在线查看demo
由于您希望数字至少以一位数字开头,因此以下匹配;
^
- 字符串锚的开始。
(?:
- 打开第一个非捕获组。
\d
- 匹配单个数字。
(?=
打开正向先行。
\d*\*?\d*
- 任意数量的数字,一个可选的通配符,以及任意数量的数字(只允许一个通配符)。
(?:
- 打开嵌套的第二个非捕获组。
[ ,;]|$
- 匹配字符 class 或 中的任意字符然后字符串结尾.
)
- 关闭第二个非捕获组。
)
- 关闭正面前瞻。
[\d*]{0,9}
- 匹配字符 class 中的 0-9 个字符(数字或通配符)。
(?:
- 打开第三个非捕获组。
[ ,;]|$
- 匹配字符 class 或 中的任意字符然后字符串结尾.
)
- 关闭第三个非捕获组。
)
- 关闭第一个非捕获组。
+
- 至少重复第一个非捕获组一次。
$
- 结束字符串锚点。
EDIT1:以上内容允许尾随逗号、分号或 space。如果你想避免这种情况,你可以使用:
^(?:\d(?=\d*\*?\d*[ ,;])[\d*]{0,9}[ ,;])*\d(?=\d*\*?\d*$)[\d*]{0,9}$
在线查看demo
EDIT2:上面的每个数字只允许一个通配符。如果您的意图是允许多个(但不是一个接一个,您可以尝试:
^(?:\d(?!.*\*\*.*[ ,;])[\d*]{0,9}[ ,;])*\d(?!.*\*\*.*$)[\d*]{0,9}$
在线查看demo
EDIT3:如果出于某种原因您决定 想要允许连续的通配符(但仍然至少以一位数字开头),您可以选择:
^(?:\d[\d*]{0,9}[ ,;])*\d[\d*]{0,9}$
在线查看demo
所以我有一个输入字段,客户可以在其中输入长度为 1-10 的数字,并使用至少有 1 个数字作为前缀的通配符。 (* 不允许,而 1* 可以)
可以在字符串中间设置通配符,但表达式的整体最大长度为10。 此时我通过以下表达式收到了这个结果:
^([ ,;]?(?=.{1,10}$)((\d{1,9})(\*?)(\d{0,9}?))[ ,;]?)$
现在是问题。正如您在表达式中看到的,分隔符 SPACE、COMMA 和 SEMI-COLON 允许出现在字符串的开头或结尾,因为客户端可以在该组合中输入多个数字。 [ ,;]?
但他不能,因为最大长度为 10 (?=.{1,10}$)
。
另一方面,如果我删除最大长度限制,那么您可以输入一个超过 10 的数字(现在最多正好是 19 个字符)123456789*123456789
-> 将被允许不受限制。
有什么方法可以限制表达式,分隔符之间的字符长度必须是 10 个绝对最大长度,但总的来说最大长度可以更长以输入更多数字?
也许:
^(?:\d(?=\d*\*?\d*(?:[ ,;]|$))[\d*]{0,9}(?:[ ,;]|$))+$
在线查看demo
由于您希望数字至少以一位数字开头,因此以下匹配;
^
- 字符串锚的开始。(?:
- 打开第一个非捕获组。\d
- 匹配单个数字。(?=
打开正向先行。\d*\*?\d*
- 任意数量的数字,一个可选的通配符,以及任意数量的数字(只允许一个通配符)。(?:
- 打开嵌套的第二个非捕获组。[ ,;]|$
- 匹配字符 class 或 中的任意字符然后字符串结尾.)
- 关闭第二个非捕获组。
)
- 关闭正面前瞻。
[\d*]{0,9}
- 匹配字符 class 中的 0-9 个字符(数字或通配符)。(?:
- 打开第三个非捕获组。[ ,;]|$
- 匹配字符 class 或 中的任意字符然后字符串结尾.)
- 关闭第三个非捕获组。
)
- 关闭第一个非捕获组。
+
- 至少重复第一个非捕获组一次。$
- 结束字符串锚点。
EDIT1:以上内容允许尾随逗号、分号或 space。如果你想避免这种情况,你可以使用:
^(?:\d(?=\d*\*?\d*[ ,;])[\d*]{0,9}[ ,;])*\d(?=\d*\*?\d*$)[\d*]{0,9}$
在线查看demo
EDIT2:上面的每个数字只允许一个通配符。如果您的意图是允许多个(但不是一个接一个,您可以尝试:
^(?:\d(?!.*\*\*.*[ ,;])[\d*]{0,9}[ ,;])*\d(?!.*\*\*.*$)[\d*]{0,9}$
在线查看demo
EDIT3:如果出于某种原因您决定 想要允许连续的通配符(但仍然至少以一位数字开头),您可以选择:
^(?:\d[\d*]{0,9}[ ,;])*\d[\d*]{0,9}$
在线查看demo