首页 > 解决方案 > 使用正则表达式将字符串分成三部分

问题描述

我有一个字符串:“用户 john.hughes 从 192.168.82.245 登录”

如何使用正则表达式将其分成两部分:“用户从 192.168.82.245 登录”、“john.hughes”?

我试过这个(我使用perl):

$message =~ /(\w+) (.+) (.+)/;
my($user,$msg) = ($2,"$1 $3");

但它不起作用,$user 等于“aleksandr.fetisov 从登录”,而不是“aleksandr.fetisov”

一个问题是我的字符串也可以等于“用户 john.hughes 登录”,在这种情况下,用户和 msg 必须等于“用户登录”,“john.hughes”

标签: regexperl

解决方案


您的两种类型的字符串在前面似乎有一个固定的组件,并且您的用户名不能有空格。您可以使用这两件事来制作模式并使用替换。

my $str = "User john.hughes logged in from 127.0.0.1";
$str =~ s/(?<=User\s)(\S+)\s//;
print "$1, $str";

这使用了一种更高级的正则表达式功能,称为正向回溯。在匹配任何内容之前,基本上需要有模式User(带有空格,我用\s空格表示,因为它比模式中的随机空格更容易阅读)。用户名没有空格,因此我们可以在之后捕获尽可能多的空格字符\S+。然后是一个空格。

然后我们将其替换为空。向后看的好处是它不是将被替换的模式的一部分。所以替换的结果将是用户名和它直接跟随的空白字符从字符串中消失了。因为有一个捕获组(),所以用户名将进入$1


推荐阅读