Javascript 有没有更好的方法来编写不匹配前导和尾随空格以及字符限制的正则表达式?
我的正则表达式是Javascript 有没有更好的方法来编写不匹配前导和尾随空格以及字符限制的正则表达式?,javascript,regex,Javascript,Regex,我的正则表达式是 ^[A-z0-9]*[A-z0-9\s]{0,20}[A-z0-9]*$ 这个正则表达式的最终目标是不允许前导和尾随空格,同时将输入的字符限制为20个,而上面的正则表达式在这方面做得并不好 我发现了一些与此类似的问题,最接近的问题是,但它没有限制字符的数量。这确实解决了前导空格和尾随空格的问题 我也看到了一种使用否定和另一种消极前瞻的方法,但这对我来说效果不太好 有没有更好的方法来编写上面限制为20个字符的正则表达式?允许重复的字符非常难看,尤其是当允许的字符列表很大且特定时
^[A-z0-9]*[A-z0-9\s]{0,20}[A-z0-9]*$
这个正则表达式的最终目标是不允许前导和尾随空格,同时将输入的字符限制为20个,而上面的正则表达式在这方面做得并不好
我发现了一些与此类似的问题,最接近的问题是,但它没有限制字符的数量。这确实解决了前导空格和尾随空格的问题
我也看到了一种使用否定和另一种消极前瞻的方法,但这对我来说效果不太好
有没有更好的方法来编写上面限制为20个字符的正则表达式?允许重复的字符非常难看,尤其是当允许的字符列表很大且特定时。Hmm,如果需要排除单个字符文本,我会选择:
^[A-z0-9][A-z0-9\s]{0,18}[A-z0-9]$
如果也可以使用单个字符:
^[A-z0-9](?:[A-z0-9\s]{0,18}[A-z0-9])?$
嗯,如果需要排除单字符文本,我会选择:
^[A-z0-9][A-z0-9\s]{0,18}[A-z0-9]$
如果也可以使用单个字符:
^[A-z0-9](?:[A-z0-9\s]{0,18}[A-z0-9])?$
更新: 我更喜欢这个。我们使用负前瞻来确保字符串末尾没有
^\s
(字符串开头的空格)或\s$
空格。然后匹配1个字母数字字符。我们重复1-20次
/^(?:(?!^\s|\s$)[a-z0-9\s]){1,20}$/i
首字母: 我在字符串的开头(
(?!…)
)使用一个负的前向查找,以确保我们不会以空格开头。然后我们检查0-19个字母数字(由于i
modifier而不区分大小写)或空白字符。最后,由于不能在Javascript中使用lookbehinds,因此我们确保以纯字母数字字符(无空格)结束
/^(?!\s)[a-z0-9\s]{0,19}[a-z0-9]$/i
更新: 我更喜欢这个。我们使用负前瞻来确保字符串末尾没有
^\s
(字符串开头的空格)或\s$
空格。然后匹配1个字母数字字符。我们重复1-20次
/^(?:(?!^\s|\s$)[a-z0-9\s]){1,20}$/i
首字母: 我在字符串的开头(
(?!…)
)使用一个负的前向查找,以确保我们不会以空格开头。然后我们检查0-19个字母数字(由于i
modifier而不区分大小写)或空白字符。最后,由于不能在Javascript中使用lookbehinds,因此我们确保以纯字母数字字符(无空格)结束
/^(?!\s)[a-z0-9\s]{0,19}[a-z0-9]$/i
- 我认为您的正则表达式将输入限制为22个字符,而不是20个字符
- 您是否知道字符范围[A-z]包括字符
[\]^
- 我想我应该这样做:
input = input.trim().replace(/\s+/, ' '); if (input.length > MAX_INPUT_LENGTH || ! /^[a-z ]+$/i.match(input) ) { # raise exception? }
- 我认为您的正则表达式将输入限制为22个字符,而不是20个字符
- 您是否知道字符范围[A-z]包括字符
[\]^
- 我想我应该这样做:
input = input.trim().replace(/\s+/, ' '); if (input.length > MAX_INPUT_LENGTH || ! /^[a-z ]+$/i.match(input) ) { # raise exception? }
\S
匹配非空白字符。因此,这应该与您要查找的内容相匹配:
^\S.{0,18}\S$
也就是说,一个非空格字符\S
,后跟最多18个任何类型的字符
(空格或非空格),最后是一个非空格字符
上述正则表达式的唯一限制是该值必须至少为2个字符。如果需要允许1个字符,可以使用:
^\S(.{0,18}\S)$
如果您希望验证用户名(正如您暗示的,但没有明确说明),那么您可能希望只允许数字、字母和下划线。在这种情况下,
^\w{1,20}$
就足够了。\S
匹配非空白字符。因此,这应该与您要查找的内容相匹配:
^\S.{0,18}\S$
也就是说,一个非空格字符\S
,后跟最多18个任何类型的字符
(空格或非空格),最后是一个非空格字符
上述正则表达式的唯一限制是该值必须至少为2个字符。如果需要允许1个字符,可以使用:
^\S(.{0,18}\S)$
如果您希望验证用户名(正如您暗示的,但没有明确说明),那么您可能希望只允许数字、字母和下划线。在这种情况下,^\w{1,20}$
就足够了。使用这种模式^(?!\s)。{0,20}(?)
^(?!\s)
行的开头没有空格
{0,20}
后跟0到20个字符
(?以非空格字符结尾
或者这个模式^(\S.{0,18}\S)$
使用此模式^(?!\s)。{0,20}(?)
^(?!\s)
行的开头没有空格
{0,20}
后跟0到20个字符
(?以非空格字符结尾
或者这个模式^(\S.{0,18}\S)$
这个区分大小写吗?[A-z]
与[A-Za-z]
不同。为了说明@OnlineCop的评论:@OnlineCop我不知道…@Robin谢谢你的链接。这有帮助。这个区分大小写吗?[A-z]
与[A-Za-z]不一样
。为了说明@OnlineCop的评论:@OnlineCop我不知道…@Robin谢谢你的链接。这很有帮助。我特别需要正则表达式。我特别需要正则表达式。最小字符是0,所以如果它是空的,它应该通过。^(s(.{0,18}\s)?)?$
将允许它为空。最小字符数是0,所以如果它为空,它应该通过。^(S(.{0,18}\S)??$
将允许它为空。我不太熟悉:,那么你能给我一个简短的解释吗?^\S | \S$)真的是这样吗?如果是这样,我从来不知道。@dalawh(?:…)
是一个非捕获组。我们需要一个组来执行重新捕获