首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Perl:在模式之后删除字符串的一部分

Perl:在模式之后删除字符串的一部分
EN

Stack Overflow用户
提问于 2013-08-03 10:23:22
回答 4查看 16.1K关注 0票数 1

我有这样的条件:

代码语言:javascript
运行
复制
trn_425374_1_94_-
trn_12_1_200_+
trn_2003_2_198_+

我想在第一个数字之后把它们分开,就像这样:

代码语言:javascript
运行
复制
trn_425374
trn_12
trn_2003

我尝试了以下代码:

代码语言:javascript
运行
复制
$string =~ s/(?<=trn_\d)\d+//gi;

但返回与输入相同的内容。我一直在跟踪类似问题的例子,但我不知道自己做错了什么。有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-03 10:27:38

进行分组以保存找到的第一位数,并使用.*从其中删除到行尾:

代码语言:javascript
运行
复制
#!/usr/bin/env perl

use warnings;
use strict;

while ( <DATA> ) { 
    s/(\d+).*$/$1/ && print;
}

__DATA__
trn_425374_1_94_-
trn_12_1_200_+
trn_2003_2_198_+

它产生:

代码语言:javascript
运行
复制
trn_425374
trn_12
trn_2003
票数 2
EN

Stack Overflow用户

发布于 2013-08-03 12:31:52

如果您正在运行Perl 5版本10或更高版本,那么您可以访问\K (“保存”)正则表达式转义。\K之前的所有内容都被排除在替换之外,因此这将删除第一个数字序列之后的所有内容(换行符除外)。

代码语言:javascript
运行
复制
s/\d+\K.+//;

使用早期版本的Perl,您必须捕获要保留的字符串的一部分,并在替换中替换它。

代码语言:javascript
运行
复制
s/(\D*\d+).+/$1/;

请注意,这两种方法都不会删除任何尾随换行符。如果您也想去掉这些字符串,那么要么先chomp字符串,要么将/s修饰符添加到替换中,如下所示

代码语言:javascript
运行
复制
s/\d+\K.+//s;

代码语言:javascript
运行
复制
s/(\D*\d+).+/$1/s;
票数 3
EN

Stack Overflow用户

发布于 2013-08-03 10:32:21

您的regexr应该是:

代码语言:javascript
运行
复制
$string =~ s/(trn_\d+).*/$1/g;

它将整个匹配替换为$1 (这是要保留的字符串部分)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18031804

复制
相关文章

相似问题

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