如何使用正则表达式删除/ 1或/ 2?

时间:2014-08-02 03:12:10

标签: regex perl parsing regex-negation

正则表达大师,

以下是我要用正则表达式解析的以下代码行:

@ERR030882.2595 HWI-BRUNOP16X_0001:3:1:6649:5175#0/1

我想获得以下内容:

@ERR030882.2595 HWI-BRUNOP16X_0001:3:1:6649:5175#0

我在rubular.com上写了以下正则表达式:

(@.* *.)(!?(\/.))

我的想法是使用否定来移除/ (!?(\/.))。但是,这会产生整条生产线吗?

@ERR030882.2595 HWI-BRUNOP16X_0001:3:1:6649:5175#0/1

为什么(?!thisismystring)没有删除/ 1?我用谷歌搜索了火,但他们似乎建议我已经尝试过类似的事情了吗?我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

我认为你要编写的是/(\@.* .*)(?=\/\d)/(你需要转义符号@以防止Perl将其视为一个数组)但你需要一个正面前瞻,因为你想要匹配所有内容,直到下面的字符是一个斜杠后跟一个数字。

这是一个演示的程序。

use strict;
use warnings;
use 5.010;

my $s = '@ERR030882.2595 HWI-BRUNOP16X_0001:3:1:6649:5175#0/1';

$s =~ /(\@.* .*)(?=\/.)/;

print $1, "\n";

但是 你最好复制整个字符串并删除斜杠及其后的所有内容,比如

use strict;
use warnings;

my $s = '@ERR030882.2595 HWI-BRUNOP16X_0001:3:1:6649:5175#0/1';

(my $fixed = $s) =~ s{/\d+$}{};

print $fixed, "\n";

<强>输出

@ERR030882.2595 HWI-BRUNOP16X_0001:3:1:6649:5175#0