在正则表达式中匹配空格


229

我需要在PHP正则表达式中匹配一个空格字符。任何人有任何想法吗?

我的意思是像“ gavin schulz”一样,两个单词之间的空格。我使用正则表达式来确保只允许使用字母,数字和空格。但是我不确定如何找到空间。这就是我现在所拥有的:

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);

2
嗯...对于匹配'a'或'b'...也没有问题...;)

1
您应该看到正则表达式示例
T.Todua

Answers:


368

如果您正在寻找一个空格,那就是" "(一个空格)。

如果要查找一个或多个,则为" *"两个空格和一个星号)或" +"(一个空格和一个加号)。

如果要查找公共间距,请使用"[ X]""[ X][ X]*"或物理制表符"[ X]+"在哪里X(在所有这些示例中,每个制表符前面都有一个空格)。

这些将在我见过的每一个正则表达式引擎中都可以使用(其中有些甚至没有一个或多个"+"字符ugh)。

如果您知道您将使用更现代的正则表达式引擎之一,那么"\s"它的变化就是必经之路。另外,我相信单词边界也与行的开头和结尾匹配,这在您寻找可能出现的不带空格的情况下很重要。

特别是对于PHP,此页面可能会有所帮助。

在您的编辑中,您似乎要删除所有无效字符的开始是(请注意正则表达式中的空格):

$newtag = preg_replace ("/[^a-zA-Z0-9 ]/", "", $tag);
#                                    ^ space here

如果您还想通过技巧来确保每个单词之间只有一个空格,而开头或结尾都没有空格,那会有些复杂(可能还有另一个问题),但基本思路是:

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space
$newtag = preg_replace ("/^ /", "", $tag);  # remove space from start
$newtag = preg_replace ("/ $/", "", $tag);  # and end

他原来的正则表达式似乎要替换“”字符。您正在否定空间,因此不会按预期“删除”他的空间。
Suroot

引述:“只允许字母,数字和空格”,Gavin最初的RE是错误的(这就是为什么他问这个问题)。我的RE删除了所有不属于其中之一的内容。
paxdiablo

为什么空格必须位于匹配模式的末尾而不是中间?
沃伦

1
@warren,事实并非如此。“此处的空格”注释不是说明该空格到达的位置,而是说明那里有空格(以防读者没有意识到)。
paxdiablo

@Mike,不,不是这样。这里的意图是替换不在集合中的所有字符A-Za-z...。方括号内的尖号指示了这一点。移动插入方括号外面改变其含义匹配字符字符串的开始设定。
paxdiablo 16/09/20


34

这是您需要了解的有关正则表达式空白的所有信息:

  • [[:blank:]] 仅空格或制表符
  • [[:space:]] 空格
  • \s 任何空白字符
  • \v 垂直空格
  • \h 水平空白
  • x 忽略空格

5

在我看来,在这种情况下使用REGEX可能实在是太过分了。为什么不仅仅通过strpos来找到空格字符。此外,正则表达式中的空格字符也没有什么特别的,您应该能够像搜索其他任何字符一样搜索它。也就是说,除非禁用了模式空白,否则在这种情况下几乎没有必要。



4

我正在使用正则表达式来确保只允许使用字母,数字和空格

然后,就像在现有内容上添加一个空格一样简单:

$newtag = preg_replace("/[^a-zA-Z0-9 ]/", "", $tag);

(请注意,我删除了s|似乎是无意的?肯定s是多余的;|如果需要,可以将其还原)

如果您特别想要* a *空间(在单个空间中),则将需要一个比此更复杂的表达式,并且可能需要考虑单独的非正则表达式逻辑。


3

您也可以将\ b用作单词边界。对于这个名字,我会使用类似这样的东西:

[^\b]+\b[^\b]+(\b|$)

编辑将其修改为Perl示例中的正则表达式

if( $fullname =~ /([^\b]+)\b[^\b]+([^\b]+)(\b|$)/ ) {
 $first_name = $1;
 $last_name = $2;
}

重新编辑根据您想要的内容:

$new_tag = preg_replace("/[\s\t]/","",$tag);


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.