给出以下一行:
rebeka mecsek:/export/home5/users/rebeka;
我想从这一行只得到“mecsek”这个词。 “rebeka”和“mecsek”这两个词之间有一个空格,而且该行没有空格。
我尝试了以下内容:
$homeserver=~s/.*\s//;
但我不希望冒号或跟随它的部分只有“mecsek”这个词。
有人能帮助我吗?
非常感谢!
答案 0 :(得分:4)
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
。