以下perl程序有一个正则表达式,用于实现我的目的。但是,这也捕获了字符串中的结果。我怎样才能获得由空格/换行符/制表符分隔的字符串?
我使用的测试数据如下: http://sainikhil.me/stackoverflow/dictionaryWords.txt
use strict;
use warnings;
sub print_a_b {
my $file = shift;
$pattern = qr/(a|b|A|B)\S*(a|b|A|B)/;
open my $fp, $file;
my $cnt = 0;
while(my $line = <$fp>) {
if($line =~ $pattern) {
print $line;
$cnt = $cnt+1;
}
}
print $cnt;
}
print_a_b @ARGV;
答案 0 :(得分:3)
您可以考虑使用anchor like \b
: word boundary
这有助于在单词之前和之后应用正则表达式。
\b(a|b|A|B)\S*(a|b|A|B)\b
更简单,因为Avinash Raj添加了in the comments:
(?i)\b[ab]\S*[ab]\b
答案 1 :(得分:1)
如果同一行中有多个单词,则可以在正则表达式中使用单词边界,如下所示:
(?i)\b[ab][a-z]*[ab]\b
模式代码是:
$pattern = /\b[ab][a-z]*[ab]\b/i;
但是,如果要检查只有单词的行,则可以使用:
(?i)$[ab][a-z]*[ab]$
更新:对于您的评论*以相同字符*开头和结尾的行,您可以使用此正则表达式:
(?i)\b([a-z])[a-z]*\1\b
但如果你想要任何角色而不是像上面那样的字母,你可以使用:
(?i)\b(.)[a-z]*\1\b