如何在正则表达式中获取字符串并在匹配字符串后删除其他字符串

时间:2018-11-10 06:11:55

标签: php regex instagram-api

我的输入正在关注

1等等@username_。 sblah sblah sblah

我需要的输出如下 用户名_。

现在,我做这个表情

^.*\@([a-zA-Z0-9\.\_]+)$

可用于以下

1等等@username _。

但是如果我将其用于整行,则无法正常运行

因此它获得用户并在用户之前删除 但是一旦获得用户

,我将如何删除其余部分

请注意,如果您有更好的工具,请使用regex101进行测试,请在下面编写。

2 个答案:

答案 0 :(得分:1)

您的模式使用^$,这意味着它需要完全匹配,而您的模式只是部分匹配。
通过添加.*,它变成一个完整的正则表达式,并且符合预期。

"/^.*\@([a-zA-Z0-9\.\_]+).*$/"

std::all_of(s.begin(), s.end(), isspace))

另一种方法是使用这样的部分正则表达式。
它会跳过所有内容直到@,然后将所有内容捕获到一个点

$str = "1 blah blah blah @username_. sblah sblah sblah";
preg_match("/.*?\@(.*?\.)/", $str, $match);

var_dump($match);

https://3v4l.org/i4pVd

答案 1 :(得分:0)

要与示例数据中的用户名匹配,您可以preg_match并省略$来声明字符串末尾的位置,如本demo所示。请注意,您不必在字符类中转义@以及点和下划线。

要在示例数据中获取用户名,您还可以使用:

@\K[\w.]+

那将匹配

  • @字面上匹配
  • \K忘记以前匹配的内容
  • [\w.]+匹配一个单词或一个点1次以上

Regex demo

$re = '/@\K[\w.]+/';
$str = '1 blah blah blah @username_. sblah sblah sblah @test';
preg_match($re, $str, $matches);
echo $matches[0]; // username_.

Demo php