【问题标题】:Regex for letters plus space字母加空格的正则表达式
【发布时间】:2014-08-15 07:46:16
【问题描述】:

我正在尝试使用正则表达式来测试输入字段中允许的字母和空格。我尝试使用/^[a-zA-Z]*$/,但这不允许空格。

更新了这个问题。我希望单词之间只有一个空格。 例如,我有一个像新奥尔良这样的城市名称,所以应该只允许字母和单词之间的一个空格。

【问题讨论】:

  • 为什么需要限制有效输入的空格数?如果您要求用户输入城市名称,则允许他们输入任意数量的空格,然后删除多个空格。因此,有人可以键入“NewOrleans”,您的代码会将其理解为“NewOrleans”。

标签: regex


【解决方案1】:

[a-aA-Z] 字符类和 \s 字符类有以下注意事项。

如果您希望接受 Unicode,a-zA-Z 可能过于严格,在这种情况下,\p{Alpha} 将是一个更好的字符类。

\s 可能过于宽松或过于严格,具体取决于您的正则表达式所使用的 Unicode 或 ASCII 语义。您可能只想在字符类中放置一个空格。

如果我们知道什么语言以及您是否打算使用 Unicode 语义,那可能会有所帮助。事情已经不像以前那么简单了。

更新:

这是一个更强大的解决方案,它仍然具有原始的 Unicode 警告,但允许单词之间有一个空格字符,其他任何地方都没有。

use strict;
use warnings;

my @cities = (
  'New Orleans',
  'New Jersey',
  'Salt Lake City',
  'Sacramento',
  ' Leading space',
  'Trailing space ',
  'Two  consecutive spaces',
  '  Two leading spaces',
  'Two trailing spaces  ',
);

foreach my $city ( @cities ) {
  print "<<$city>>: ";
  if( $city =~ m/^[a-zA-Z]+(?:\s[a-zA-Z]+)*$/ ) {
    print "match\n";
  }
  else {
    print "reject\n";
  }
}

【讨论】:

  • 这很好用,但我只想允许单个空格。现在它允许多个空格。
  • 然后您需要编辑您的问题并准确定义您想要的内容。听起来你想要“我想允许任何字母,可能加上一个空格,但只有一个空格”,但可能不是,因为我不知道你的意思。
  • 这样做? /^[a-zA-Z\s]*$/ &amp;&amp; !/\s{2,}/(例如),但接下来的问题可能是如何防止字符串开头和结尾的空格,我们开始进入一个不断增长的规范,开始超越与语言无关的解决方案。跨度>
  • @ericb 用另一个正则表达式示例更新了我的帖子。
【解决方案2】:

匹配由单个空格分隔的多组字母。

(\w+ )+\w

【讨论】:

  • 当然 \w 匹配数字和下划线,在 Unicode 下,大约 100,000+ 其他东西。这需要至少 2 个字符(以空格分隔)来匹配。
猜你喜欢
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 2020-04-30
相关资源
最近更新 更多