【问题标题】:Javascript regular expression spaces checkJavascript正则表达式空格检查
【发布时间】:2012-07-27 16:10:00
【问题描述】:

我有一个问题要问你,我自己似乎无法弄清楚。
假设我想验证用户的名字。有些可以包含多个部分,例如“John William”,中间有一个空格。我想要做的是将输入匹配到一个正则表达式,该表达式会找出名称是否在开头或结尾包含任何空格。
此外,正则表达式应该检查名称中是否只有字母(a-z,小写和大写)。

这是我目前想出的:

/^\s+[A-z]+|[A-z]+\s+$/

但不知何故,这个正则表达式不会注意到任何其他字符(如破折号、下划线、& 符号等)。基本上它所做的只是告诉我输入的开头或结尾是否有空格。

谁能帮帮我?

编辑:

这是我正在使用的完整代码:

$(document).ready(function() {
    $('#firstname, #lastname').bind('keyup blur', function() {
        var _input = $(this);
        var _illegal = Validate_Regexp(_input.val(), /^\s+[A-Za-z]+|[A-Za-z]+\s+$/);
        if (_illegal == true) {
            $("#"+_input.attr('id')+".validator").css({
                'background-image' : 'url(./images/icons/bullet_red.png)',
            });
        } else {
            $("#"+_input.attr('id')+".validator").css({
                'background-image' : 'url(./images/icons/bullet_green.png)',
            });
        }
    });
});

function Validate_Regexp($value, $regexp) {
    return $regexp.test($value);
}

编辑 2:

我同意 Charlie 的回答,但他的回答迫使我使用名称的 2 部分,而不是我想要的。
我将代码更改为:

var isLegal = /^[a-zA-Z]+(\s+[a-zA-Z]+)?$/.test(stringToTest);

到:

var isLegal = /^[a-zA-Z]+(\s[a-zA-Z]+)*?$/.test(stringToTest);

【问题讨论】:

  • 要检查大小写字母,请使用[a-zA-Z]
  • @kontur [A-z] 所做的与 [a-zA-Z] 基本相同。但这仍然没有帮助我的结果。事实上,它只会让情况变得更糟,如果在中间的空格之后实际上有第二部分,则只会在最后检查输入是否有空格。
  • 我不知道,只是以前从未见过这种书写形式。即使在developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions 上,似乎也明确使用了 a-z 和 A-Z - 可能只是为了清楚起见。

标签: javascript regex


【解决方案1】:

我注意到您正在检查非法字符串。让我们把它转过来,检查一个有效的字符串:

 var isValid = /^[a-zA-Z]+(\s+[a-zA-Z]+)?$/.test(stringToTest);

结果:

 /^[a-zA-Z]+(\s+[a-zA-Z]+)?$/.test("john doe"); // true
 /^[a-zA-Z]+(\s+[a-zA-Z]+)?$/.test("john"); // true

 /^[a-zA-Z]+(\s+[a-zA-Z]+)?$/.test("john d_oe"); // false
 /^[a-zA-Z]+(\s+[a-zA-Z]+)?$/.test(" john doe "); // false
 /^[a-zA-Z]+(\s+[a-zA-Z]+)?$/.test(" john doe"); // false
 /^[a-zA-Z]+(\s+[a-zA-Z]+)?$/.test("john doe "); // false
 /^[a-zA-Z]+(\s+[a-zA-Z]+)?$/.test("john "); // false

翻译成你现有的代码:

    var isValid = Validate_Regexp(_input.val(), /^[a-zA-Z]+(\s+[a-zA-Z]+)?$/);
    if (isValid) {
        $("#"+_input.attr('id')+".validator").css({
            'background-image' : 'url(./images/icons/bullet_blue.png)',
        });
    } else {
        $("#"+_input.attr('id')+".validator").css({
            'background-image' : 'url(./images/icons/bullet_red.png)',
        });
    }

【讨论】:

  • 感谢您的回复。我看不出我是怎么错过的,因为它确实对我的结果非常重要,但是,它仍然允许出现破折号、下划线、& 等字符。
  • 老实说,它仍然没有。我已经用我正在使用的完整代码更新了我的问题,也许这会对这个主题有新的认识。
  • 我注意到您正在检查非法字符串。让我们把它转过来检查一个有效的字符串。 (您不希望名称周围有任何空格,对吗?)
  • 你说得对,我不希望名称周围有任何空格。但我确实希望人们能够使用一个名字,而不是强迫他们使用两个名字。
  • 啊。硒更新了答案。这应该工作 /^[a-zA-Z]+(\s[a-zA-Z]+)?$/
【解决方案2】:

你真的不在乎是否有前导或尾随空格,或者名称之间有多少,所有这些都非常容易管理而不会打扰用户。

所以一个合适的函数可能是:

function checkNames(s) {
  // Remove excess spaces
  s.replace(/(^\s*)|(\s*$)/g, '').replace(/\s+/g, ' ');

  // Check remaining content
  return /[a-z]+ [a-z]+/i.test(s);
}

但请注意,名称可以连字符并包含数字(例如 William Gates the 3rd)或英文字母以外的字母。所以通常你让用户输入他们想要的任何内容,然后处理空格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多