首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Perl regex删除数字/标点符号组合

Perl regex删除数字/标点符号组合
EN

Stack Overflow用户
提问于 2014-07-01 16:08:10
回答 2查看 273关注 0票数 0

我正在尝试删除由空格分隔的字符串中的所有数字/标点符号组合,即,

代码语言:javascript
运行
复制
$string = " 13-acetate 9-11 777 >3 ctl-54 2!3 ";

应该变成

代码语言:javascript
运行
复制
$string = " 13-acetate ctl-54 ";

我的尝试如下

代码语言:javascript
运行
复制
$string =~ s/\s+[\d*[:punct:]>]+\s+//g;

但这给了我

代码语言:javascript
运行
复制
$string = " 13-acetate 777 ctl-54 ";

感谢你指点我哪里出了问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-01 16:10:08

问题是,您试图在两次传递中匹配相同的空间。你得用围观镜。

代码语言:javascript
运行
复制
s/(?<!\S)[\d\p{Punct}\p{Symbol}]+(?!\S)//g;

我使用了负面的头和后视镜,这样您就不需要在输入字符串中添加前导和尾随空格。

票数 5
EN

Stack Overflow用户

发布于 2014-07-04 07:25:31

正如ikegami所指出的,你的问题是你试图两次匹配这些空格。

快速修复原始正则表达式的另一种方法是为初始边界条件创建一个替换:

代码语言:javascript
运行
复制
use strict;
use warnings;

my $string = " 13-acetate 9-11 777 >3 ctl-54 2!3 ";

$string =~ s/(?:\G|\s+)[\d[:punct:]]+\s+/ /g;

print $string;

产出:

代码语言:javascript
运行
复制
 13-acetate   ctl-54

但是,这种方法存在缺陷,因为它不允许删除字符串开头或结尾的单词。这就是为什么在执行边界条件时,负前瞻和后视是优越的。

如果你想用一种聪明的方式去除单词周围的空格,那么下面的方法就会奏效:

代码语言:javascript
运行
复制
$string =~ s{(?:\G|(\s+))[\d[:punct:]]+(?:$|(\s+))}{ 
    my @spaces = grep defined, $1, $2;
    pop @spaces;
    "@spaces"
}eg;

产出:

代码语言:javascript
运行
复制
 13-acetate ctl-54
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24514865

复制
相关文章

相似问题

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