如何編寫Regular Rxpression來搜索包含「http://」的字符串且不包含「mysite.com」?使用正則表達式搜索包含「http://」且不包含「mysite.com」的字符串
0
A
回答
6
警告
試圖拉攏正則表達式到一個適當的編程語言來實現最佳的布爾邏輯是一個吃力不討好的工作。雖然可以使用複雜的lookahead編寫/PAT1/ and not /PAT2/
,這樣它只是一個模式,但這是一項痛苦的任務。 你不要這樣做!
你應該首先解釋一下你真的在做什麼 - 在文本編輯器中進行某種匹配操作。你沒有。所以,你會得到一個通用的答案,以適應你的本地化情況。
快速解答
(?sx) # let dot cross newlines, enable comments & whitspace
(?= .* http:// ) # lookahead assertion for http://
(?! .* mysite\.com) # lookahead negation for mysite.com
使用Perl語法,你可以堅持的是(預)編譯的模式,以備將來使用一個變量是這樣的:
my $is_valid_rx = qr{
(?= .* http:// ) # lookahead assertion for http://
(?! .* mysite\.com) # lookahead negation for mysite.com
}sx; # /s to cross newlines, /x for comments & whitespace
# then later on…
if ($some_string =~ $is_valid_rx) {
# your string has an http blah and lacks a mysite blah
}
但是,如果你的目標是拉出所有這樣的鏈接,這不會幫助你,因爲這些lookaheads不會告訴你鏈接發生在字符串中的什麼位置。
在這種情況下,寫一些東西來拉出鏈接,然後過濾掉不需要的情況,使用兩個單獨的正則表達式,而不是試圖做所有事情,要容易得多。
@all_links = ($some_string =~ m{ https?://\S+ }xg);
@good_links = grep !/mysite\.com/, @all_links;
注意,沒有嘗試只匹配包含有效的URL字符,或者說沒有意外的尾隨標點符號正如經常發生在純文本鏈接。
現在,對於一個真正的答案
還要注意的是,如果你與這個解析HTML,上面介紹的方法僅僅是一個快速和骯髒的,快速和寬鬆的,拍,從 - 髖關節類型的鏈接提取。構建有效的輸入很容易產生大量的誤報,而且也不容易構建產生誤報的輸入。
與此相反,這是一個完整的程序,它在URL參數中丟棄了所有的<a ...>
和<img ...>
鏈接地址,並且實際上是這樣做的,因爲它使用了真正的解析器。
#!/usr/bin/env perl
#
# fetchlinks - fetch all <a> and <img> links from listed URL args
# Tom Christiansen <[email protected]>
# Wed Mar 14 08:03:53 MDT 2012
#
use strict;
use warnings;
use LWP::UserAgent;
use HTML::LinkExtor;
use URI::URL;
die "usage: $0 url ...\n" unless @ARGV;
for my $arg (@ARGV) {
my @links = fetch_wanted_links($arg => qw<a img>);
for my $link (@links) {
print "$arg => " if @ARGV > 1;
print "$link\n";
}
}
exit;
sub fetch_wanted_links {
my($url, @wanted) = @_;
my %wanted;
@wanted{@wanted} = (1) x @wanted;
my $agent = LWP::UserAgent->new;
# Set up a callback that collect links of the wanted variety
my @hits =();
# Make the parser. Unfortunately, we don't know the base yet
# (it might be different from $url)
my $parser = new HTML::LinkExtor sub {
my($tag, %attr) = @_;
return if %wanted and not $wanted{$tag};
push @hits, values %attr;
};
# Request document and parse it as it arrives
my $response = $agent->request(
HTTP::Request->new(GET => $url),
sub { $parser->parse($_[0]) },
);
# Expand all image URLs to absolute ones
my $base = $response->base;
@hits = map { $_ = url($_, $base)->abs } @hits;
return @hits;
}
如果你在這樣一個URL運行它,它給這個會計的所有錨和圖像鏈接:
$ perl fetchlinks http://www.perl.org/
http://www.perl.org/
http://st.pimg.net/perlweb/images/camel_head.v25e738a.png
http://www.perl.org/
http://www.perl.org/learn.html
http://www.perl.org/docs.html
http://www.perl.org/cpan.html
http://www.perl.org/community.html
http://www.perl.org/contribute.html
http://www.perl.org/about.html
http://www.perl.org/get.html
http://www.perl.org/get.html
http://www.perl.org/get.html
http://www.perl.org/about.html
http://www.perl.org/learn.html
http://st.pimg.net/perlweb/images/icons/learn.v0e1f83c.png
http://www.perl.org/learn.html
http://www.perl.org/community.html
http://st.pimg.net/perlweb/images/icons/community.v03bf8ce.png
http://www.perl.org/community.html
http://www.perl.org/docs.html
http://st.pimg.net/perlweb/images/icons/docs.v2622a01.png
http://www.perl.org/docs.html
http://www.perl.org/contribute.html
http://st.pimg.net/perlweb/images/icons/cog.v08b9acc.png
http://www.perl.org/contribute.html
http://www.perl.org/dev.html
http://www.perl.org/contribute.html
http://www.perl.org/cpan.html
http://st.pimg.net/perlweb/images/icons/cpan.vdc5be93.png
http://www.perl.org/cpan.html
http://www.perl.org/events.html
http://st.pimg.net/perlweb/images/icons/cal.v705acef.png
http://www.perl.org/events.html
http://www.perl6.org/
http://st.pimg.net/perlweb/images/icons/perl6.v8ff6c63.png
http://www.perl6.org/
http://www.perl.org/dev.html
http://www.perlfoundation.org/
http://st.pimg.net/perlweb/images/icons/onion.vee5cb98.png
http://www.perlfoundation.org/
http://www.cpan.org/
http://search.cpan.org/~jtang/Net-Stomp-0.45/
http://search.cpan.org/~vaxman/Array-APX-0.3/
http://search.cpan.org/~salva/Net-SFTP-Foreign-1.71/
http://search.cpan.org/~grandpa/Win32-MSI-HighLevel-1.0008/
http://search.cpan.org/~teejay/Catalyst-TraitFor-Component-ConfigPerSite-0.06/
http://search.cpan.org/~jwieland/WebService-Embedly-0.04/
http://search.cpan.org/~mariab/WWW-TMDB-API0.04/
http://search.cpan.org/~teejay/SOAP-Data-Builder-1/
http://search.cpan.org/~dylan/WWW-Google-Translate-0.03/
http://search.cpan.org/~jtbraun/Parse-RecDescent-1.967_008/
http://www.perl.org/get.html
http://www.perl.org/learn.html
http://www.perl.org/docs.html
http://www.perl.org/community.html
http://www.perl.org/events.html
http://www.perl.org/siteinfo.html#sponsors
http://www.yellowbot.com/
http://st.pimg.net/perlweb/images/friends/yellowbot.vcc29f5b.gif
http://www.perl.org/
http://blogs.perl.org/
http://jobs.perl.org/
http://learn.perl.org/
http://dev.perl.org/
http://creativecommons.org/licenses/by-nc-nd/3.0/us/
http://i.creativecommons.org/l/by-nc-nd/3.0/us/80x15.png
http://www.perl.org/siteinfo.html
對於任何工作,嚴重超過了一個文件,運行快速grep
眼球一般的結果,你需要使用一個合適的解析器來做這種事情。
0
相關問題
- 1. 正則表達式 - 記事本++ - 搜索包含字符串且不包含其他字符串的字符串
- 2. 正則表達式包含字符串,不包含另一個
- 3. 正則表達式字符串包含
- 4. 正則表達式:在搜索中包含文本字符串
- 5. 包含和不包含字符的正則表達式
- 6. 在正則表達式搜索中包含無字母字符
- 7. 正則表達式搜索包含+或#的字符串使用Java
- 8. preg_replace_callback(正則表達式)如果字符串不包含字符
- 9. 字符串不能包含java正則表達式元字符
- 10. 正則表達式的字符串不包含子串
- 11. 正則表達式:不包含子串
- 12. 正則表達式包含不在列表中的字符串
- 13. 正則表達式:搜索包含「cmaeventd」,而不是數字「2424」
- 14. 正則表達式搜索包含3個或更多數字的字符串
- 15. 正則表達式:user_agent字符串包含「a」但不包含「b」
- 16. Java字符串包含的正則表達式包含字母和:/
- 17. 正則表達式字符串不包含數字
- 18. PCRE正則表達式:不包含的字符串
- 19. 不包含字符串的正則表達式空格
- 20. JavaScript的正則表達式:字符串包含此,但不是
- 21. 正則表達式不包含特定的字符串
- 22. 正則表達式,如果字符串包含字符
- 23. 正則表達式的字符串不包含兩個不同的字符串
- 24. Eclipse正則表達式幫助,不包含子字符串
- 25. 正則表達式不包含字符串
- 26. 正則表達式匹配:不包含在一個字符串
- 27. 正則表達式匹配字符串不包含其他子
- 28. 正則表達式的字符串只包含小寫字母
- 29. 字符串包含特殊字符不使用Python工作,正則表達式
- 30. 正則表達式的表達式包含多餘的字符
哪種語言? – user123444555621 2012-03-14 13:09:40
沒有語言,我正在使用Adobe Dreamweaver編輯器搜索,它使我能夠使用正則表達式進行搜索。 – Cassini 2012-03-14 13:18:21
試圖將正則表達式轉換爲布爾邏輯最好的方式是用適當的編程語言完成,這是一個不盡人意的工作。雖然可以使用複雜的lookahead編寫「/ PAT1 /而不是/ PAT2 /」,這樣它只是一種模式,但這是一項痛苦的任務。 **你不想這樣做。**使用真正的編輯器如'vi',你可以簡單地進行確認檢查,以便你可以手動干預:':%s/foo/bar/gc'。 – tchrist 2012-03-14 14:24:12