regex - 如何删除以“[”开头以“]”结尾的行片段以及括号中的所有字符([和]除外)?Perl
问题描述
#!/usr/bin/perl
use strict;
use warnings;
my $del1 = "[";
my $del2 = "]";
sub rings($){
my ($line) = $_;
my @lineArr = split(" ", $line);
my $noSquareBrackets = $lineArr[0];
$noSquareBrackets =~ s/[^$del1[^$del1$del2]*$del2$]//g;
print "check: ", $noSquareBrackets, "\n";
}
$/ = "\n>";
while(<>){
/([^>]*)/;
my $seq = $1;
$seq =~s/\s//g;
$seq = rings($seq);
}
删除正则表达式之前的打印与之前完全相同。有没有人注意到,当我有很多行的 .inp 格式文件时,为什么只打印一个(第一)文件行?
输入文件有这样的行:
line 1) c1(ccc(cc1)N)S(=O)(=O)[O-].c1(ccc(cc1)C)[NH3+] 1519987
line 2) [Ce]123456([O]7[Cu]89[N](=Cc%10c7c([O]5CC)ccc%10)CC[N]8=Cc5cccc(c5[O]19)[O]2CC)(ON(=O)=[O]6)(ON(=[O]4)=O)[O]=N(=O)O3 1100946
我想删除方括号中的所有数据
解决方案
第 1 部分:为什么您的程序只打印 1 行
注意$/ = "\n>";
代码中的行。它设置记录分隔符的内容(将什么字符序列视为输入行的结尾)。
如您所见,它包含一个换行符,后跟一个>
.
现在看看你的输入。在任何换行符之后都找不到任何>
. 结果是您的代码将整个输入文件作为第一个输入行读取。
可能的解决方案是:
>
在每行的开头添加 a ,但在第一行。- 删除
$/ = "\n>";
指令,将默认记录分隔符保留为"\n"
.
第 2 部分:正则表达式
请记住,eg[
和]
in 正则表达式具有特殊含义。如果你想“从字面上”使用它们,你必须用反斜杠转义它们。
另一句话是,在“打开”之后,[
您应该匹配一个不同于]
only 的字符序列。
所以你要消除的正则表达式[...]
应该是:
s/\[[^\]]*\]//g
推荐阅读
- javascript - Angular 2将变量从一个组件传递到另一个组件
- node.js - 每次nodejs中的另一个请求失败时重试一个请求
- linux - 配置 SSL ACL 时 kafka 消费者无法连接到服务器:{test-topic=LEADER_NOT_AVAILABLE}
- sql - 如何在给定条件下获取连续行
- java - Eclipse - 无法从“https://services.gradle.org/distributions/gradle-2.1-bin.zip”安装 Gradle 发行版
- c++ - 示例 Web 服务器和字节序
- maven - 程序集中的神秘 Maven 属性'${...}'
- java - 如何从 Android Studio 中构建的 Android 应用程序连接到 Eclipse 中构建的 RESTlet Web 服务?
- regex - 如何捕获此正则表达式中的最后两个字符?
- python - 使用空格缩进实现类似标签的导航