首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >提取Perl中字符串的某些部分

提取Perl中字符串的某些部分
EN

Stack Overflow用户
提问于 2017-09-18 18:08:28
回答 2查看 1.5K关注 0票数 0

我有以下Perl字符串。长度和模式是不同的。该文件始终命名为*log.999

代码语言:javascript
运行
复制
my $file1 = '/user/mike/desktop/sys/syslog.1';
my $file2 = '/user/mike/desktop/movie/dnslog.2';
my $file3 = '/haselog.3';
my $file4 = '/user/mike/desktop/movie/dns-sys.log'

我需要在log之前提取单词。在这种情况下,sysdnshasedns-sys

我如何编写正则表达式来提取它们?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-18 18:53:05

所示字符串的主要属性是*log*短语是最后一个。

然后锚定模式,这样我们就不会在中间的某个地方匹配log

代码语言:javascript
运行
复制
my ($name) = $string =~ /(\w+)log\.[0-9]+$/;

如果.N扩展是可选的

代码语言:javascript
运行
复制
my ($name) = $string =~ /(\w+)log(?:\.[0-9]+)?$/;

上面的内容使用\w+模式来捕获log之前的文本。但该文本也可能包含非单词字符(-.等),在这种情况下,我们将使用[^/]+捕捉最后一个/之后的所有内容,正如Abigail's answer中所指出的那样。使用.N可选,注释中的每个问题

代码语言:javascript
运行
复制
my ($name) = $string =~ m{ ([^/]+) log (?: \.[0-9]+ )? $}x;

在我添加了}x修饰符的地方,忽略了里面的空格,什么可以帮助达到可实现性。

我使用了一组除/之外的分隔符,以便能够在不转义的情况下在内部使用/,然后m是强制的。[^...]是一个被否定的字符类,它匹配没有列出的任何字符。因此,[^/]+log匹配所有不属于/的连续字符,它们位于log之前。

非捕获组(?: ... )在内部对模式进行分组,以便?应用于整个组,但没有必要捕获它们。

(?:\.[0-9]+)?模式是专门编写的,因此不允许log. (在点之后没有任何内容)和log5之类的东西。但是如果这些是可以接受的,则将其更改为简单的\.?[0-9]*

Update更正了代码中的错误:对于可选的.N,有+,而不是*

票数 1
EN

Stack Overflow用户

发布于 2017-09-18 18:10:10

代码语言:javascript
运行
复制
\w+(?=log\b)

匹配一个或多个字母数字字符,后面跟着log (但不是logging等)。

如果文件名格式是固定的,则可以使用

代码语言:javascript
运行
复制
\w+(?=log\.\d+\/$)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46285645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档