【问题标题】:How to combine regex in JavaScript如何在 JavaScript 中结合正则表达式
【发布时间】:2017-08-29 09:29:04
【问题描述】:

我有一个要求,输入字符串不应该是空字符串(允许所有字符)并且长度应该在 1 到 500 之间。

我找到了单独的工作表达式,一个用于检查空字符串,一个用于长度。我无法将它们组合成一个表达式,该表达式应该告诉我输入是“空字符串”还是超过 500 个字符。

jsfiddle here

对于空字符串

var regex = /^\s*$/;

长度

{1,499}

【问题讨论】:

  • "jsfiddle here" 您问题的全部内容必须在您的问题中in,而不仅仅是链接。链接失效,使问题及其答案对未来的人们毫无用处,人们不应该离开现场来帮助你。将minimal reproducible example 放入 问题中,最好使用 Stack Snippets(<> 工具栏按钮)使其可运行。更多:How do I ask a good question?
  • 不应该是空字符串,长度在0到500之间?那里有矛盾。也许你的意思是 [1 , 499]
  • 是的,极客先生。更新了描述
  • 是否允许使用 500 个字符的字符串?
  • 允许 500 个字符的字符串。如果字符串超过 500 个字符,则不允许

标签: javascript regex


【解决方案1】:

从您检查“空”字符串的示例中,很明显您希望忽略开头或结尾的空格。

如果您实际上没有正则表达式要求,最简单的方法就是 trim 并检查长度:

str = str.trim();
if (str.length && str.length <= 500) {
    // All good
}

但如果您需要一个正则表达式(可能是 HTML5 验证正则表达式),那么只需说 1.“忽略开头的空格,2.中间需要 1-500 个字符, 和 3. 忽略末尾的空格。” (用锚确保我们匹配完整的字符串):

//          111          333
// ---------vvv----------vvv
var rex = /^\s*\S.{0,499}\s*$/;
// ------------^^^^^^^^^^
//             2222222222

注意\S,它至少需要一个非空白字符,后跟 0 到 499 个其他字符。

注意:您需要在某些时候trim 字符串,因为另一端的空格可能会超过 500 个限制。

示例用法:

// NOTE: Using 5 instead of 500 to make tests shorter
var rex = /^\s*\S.{0,4}\s*$/;
console.log(rex.test("")); // false
console.log(rex.test("a")); // true
console.log(rex.test(" a ")); // true
console.log(rex.test(" 12345 ")); // true
console.log(rex.test(" 123456 ")); // false
console.log(rex.test("123456")); // false
console.log(rex.test("1234       ")); // true
console.log(rex.test("       ")); // false
.as-console-wrapper {
  max-height: 100% !important;
}

注意:在 JavaScript 中,. 不匹配行终止字符。如果您想允许这些,请使用[\w\W](任何单词字符或非单词字符)而不是./^\s*[\w\W]{1,500}\s*$/

【讨论】:

  • @user2555212 但是,这将匹配超过 500 个字符的字符串。您的要求是长度应在 1 到 500 之间
  • @WiktorStribiżew:我将其解释为“1-500 个字符,忽略两端的空格”(正如我在开头所说的那样)。
  • @T.J.Crowder 第一段很清楚:输入字符串不应为空字符串(允许所有字符),长度应在 1 到 500 之间。您的解决方案不满足第二个要求。否则问题不明确。
  • @WiktorStribiżew:请参阅“空字符串”的正则表达式(我在第一句话中再次提到)。
  • @user2555212:要明确:如果任一端都有空格,则字符串可能有超过 500 个字符(事实上,上面的一个测试表明了这一点);如果你想删除它们,你可能会修剪。
【解决方案2】:

使用

/^(?!\s+$)[\s\S]{1,500}$/

匹配

  • ^ - 字符串开头
  • (?!\s+$) - 直到字符串末尾没有 1 个或多个空格(包含 1 个或多个空格的字符串在此处失败)
  • [\s\S]{1,500} - 任何 1 到 500 个字符(因此,不允许空字符串)
  • $ - 字符串结束。

【讨论】:

  • /[\s\S]//./有区别吗?
  • @Zevgon . 与换行符不匹配。
  • 啊,我明白了!谢谢@Wiktor
【解决方案3】:

正则表达式有点超出您的需求。怎么了……

if (myString == null || myString.length > 500){
    // handle failed validation here
}

编辑

以上将允许空字符串通过。供 1 到 500 人使用

if (myString == null || myString.length < 1 || myString.length > 500){
    // handle failed validation here
}

【讨论】:

  • '' == null // false
  • 我同意你的看法。如果条件符合上述条件
  • @evolutionxbox OP 要求 0 到 500 之间,我认为空字符串是有效的。
  • 也许我误解了? “输入字符串不能为空字符串”
  • @evolutionxbox 啊,OP 已将问题更新为在 1 到 500 之间明确说明。认为我们对问题的理解略有不同。
猜你喜欢
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
相关资源
最近更新 更多