正则表达式 - 如何在两个不同的字符串之间提取字符串?

时间:2012-02-22 10:59:49

标签: regex perl

给出以下一行:

rebeka mecsek:/export/home5/users/rebeka;

我想从这一行只得到“mecsek”这个词。 “rebeka”和“mecsek”这两个词之间有一个空格,而且该行没有空格。

我尝试了以下内容:

$homeserver=~s/.*\s//;

但我不希望冒号或跟随它的部分只有“mecsek”这个词。

有人能帮助我吗?

非常感谢!

4 个答案:

答案 0 :(得分:4)

记住Randal’s rule

  

Randal Schwartz(Learning Perl的作者)说:

     
    

当您知道自己想要保持的内容时,请使用捕获或m//g     当您知道自己想要扔掉时,请使用split

  

你知道你想要保留什么,但你没有告诉我们你知道的一切。你想要在行的第一个空格后面运行单词字符吗?

print $1, "\n" if $homeserver =~ / (\w+)/;

你想在:/之前保留最长的,最左边的单词字符串,无论发生在哪里?

print $1, "\n" if $homeserver =~ /(\w+):\//;

我们可以依赖rebeka在字符串的开头吗?

print $1, "\n" if $homeserver =~ /^rebeka (\w+)/;

如果没有,是否可以安全地假设字符串的开头是一些连续的单词字符?

print $1, "\n" if $homeserver =~ /^\w+ (\w+)/;

当与正则表达式匹配时,定义您的锚点:您可以依赖于在文本中作为标记或书挡存在的要素,以保留您想要保留的内容。另请注意,上述示例仅在条件内使用$1;永远不要无条件地使用捕获变量。

答案 1 :(得分:2)

怎么样:

$homeserver =~ s/^\S*\s(\S+):.*$/$1/;

答案 2 :(得分:0)

您需要匹配整行:

s/[^\s]+ ([^\s+]):.*/$1/

答案 3 :(得分:0)

我为模式/(?<=\S\s)([^\s:][^:]*):/投票,结果在$1