我一直在编写一个脚本,从某些文档中提取有用的命令,在网上搜索并使用一些示例后仍然无法使正则表达式正常工作。输入文件将是一个单词doc,我将需要提取一些我工作正常的基本标题信息以及两组开始和结束标记之间的所有文本,它们可以跨越多行并多次出现。下面是我的代码,它正确地提取了标题详细信息,但似乎与文档中的命令标题不匹配。
open(DAT,'<input') or die "$!";
$file = do{local $/; <DAT>};
close(DAT);
open (FH2, '>>', 'out.txt') or die "$!";
my @matches = $file =~ m/(\[$source\]|\[$target\]|\[admin\]|<IA%COMMAND>.*? <\/IA%COMMAND>|<IA%UICOMMAND>.*?<\/IA%UICOMMAND>)/g;
print FH2 @matches;
close (DAT);
close (FH2);
输入文件是word doc,其格式类似于:
random overhead
[source]
<IA%COMMAND>stuff to print </IA%COMMAND>
stuff that should be ignored
[target]
<IA%UICOMMAND>other stuff to print</IA%UICOMMAND>
stuff to be ignored
[target]
<IA%COMMAND>print out this too
and this as well </IA%COMMAND>
哪个应该导致输出:
[source]
<IA%COMMAND>stuff to print </IA%COMMAND>
[target]
<IA%UICOMMAND>other stuff to print</IA%UICOMMAND>
[target]
<IA%COMMAND>print out this too
and this as well </IA%COMMAND>
我将其分解为只搜索匹配良好的开放和关闭标签,但它似乎并不满意。*?对标签之间的内容进行不一致的匹配。任何建议将不胜感激。
答案 0 :(得分:0)
使用此正则表达式(?<=<[^/]+?>)(.+?)(?=</.+?>)
答案 1 :(得分:0)
s/(?:\A.*?(?=^\[[^[\]]*\](?:\n|\z)|\z)|(?<=[>\]]\n)(?!\[[^[\]]*\]*(?:\n|\z)|<[^>]*COMMAND>).*?(?=^\[[^[\]]*\](?:\n|\z)|^<[^>]*COMMAND>|\z))//gms;
请参阅 this demo 。