给定一个html文件,如何找到使用正则表达式的重复id值?我需要它在SublimeText上搜索。
例如:使用id=("[^"]*").*id=\1
,我可以在同一行中找到重复的id键
<img id="key"><img id="key">
但我需要的是用不同的键对在多行中执行相同的操作。例如,在这种情况下,key
和key2
是重复的ids。
<img id="key">
<img id="key2">
<img id="key">
<img id="key3">
<img id="key2">
<img id="key">
注意:我只是作为一个例子使用img标记,html文件更复杂。
发布于 2015-04-16 17:35:52
不管出于什么原因,崇高的.
匹配器不包括换行,所以您需要这样做:id=("[^"]+")(.|\n)*id=\1
不过,老实说,我宁愿使用Unix实用程序:
grep -Eo 'id="[^"]+"' filename | sort | uniq -c
3 id="key"
2 id="key2"
1 id="key3"
如果这些是完整的HTML文档,您可以使用W3的HTML验证器来捕获dups和其他错误。
发布于 2015-04-16 17:43:07
如果您所要做的只是查找重复的it,那么下面是我编写的一个小小的Perl程序,它可以做到这一点:
use strict;
use warnings;
my %ids;
while ( <> ) {
while ( /id="([^"]+)"/g ) {
++$ids{$1};
}
}
while ( my ($id,$count) = each %ids ) {
print "$id shows up $count times\n" if $count > 1;
}
叫它"dupes.pl“。然后像这样调用它:
perl dupes.pl file.html
如果我在你的样本上运行它,它会告诉我:
key shows up 3 times
key2 shows up 2 times
它有一些限制,比如它找不到id=foo
或id='foo'
,但可能会帮助您在未来的道路上前进。
发布于 2015-04-16 18:37:40
崇高文本的regex搜索似乎默认为多行模式,这意味着.
将不匹配换行。可以使用模式修饰符使用单行模式使.
匹配新行:
(?s)id=("[^"]+").*id=\1
(?s)
是单行模式修饰符。
但是,这个regex在查找所有重复键方面做得很差,因为它只能在示例key
中匹配从key
到key
。您可能需要一个多步骤的过程,以找到所有的钥匙,可以编程。正如其他人所显示的,您需要(1)首先提取所有ids,然后(2)对它们进行分组并计数,以确定哪些ids是dupe。
或者,手动方法是将regex模式更改为查找重复in,然后在Sublime文本中找到下一个匹配项:
(?s)id=("[^"]+")(?=.*id=\1)
使用上面的模式和示例HTML,您将看到突出显示的下列匹配:
<img id="key"> <-- highlighted (dupe found on 3rd line)
<img id="key2"> <-- highlighted (dupe found on 5th line)
<img id="key"> <-- highlighted (next dupe found on last line)
<img id="key3">
<img id="key2">
<img id="key">
请注意,前瞻并没有显示文件后面的实际欺骗。它将在第一次出现时停止,并表明稍后会出现欺骗。
https://stackoverflow.com/questions/29681442
复制相似问题