您好我是perl的新手,并尝试编写一个正则表达式来查找文件中一行中特定数字范围和字符串的匹配项,我需要找到这些行(“文档有15行和2列”)。
我知道我遗漏了一些东西,但到目前为止我尝试过的代码是:
if(/^[a-zA-Z\d]+(has\s[1-9][0-9]$)\srows.*columns/)
{
print "$_\n";
}
如果有人让我知道这里有什么问题,那将会非常有用!
答案 0 :(得分:3)
这里的其他答案都很好,但要解释你使用的正则表达式出了什么问题:
if(/^[a-zA-Z\d]+(has\s[1-9][0-9]$)\srows.*columns/)
第一个问题:表达式没有在字符串的开头和单词has
之间指定任何空格,因此此模式无法匹配Document has...
中的空格
第二个问题:正则表达式中的$
字符表示“如果该行在此处结束,则匹配”。在正则表达式中间使用$
锚点几乎总是错误的;匹配的唯一方法是在多行字符串中,如
Documenthas 15
rows and 7 columns
对表达式进行这两项更改会使其有效:
if(/^[a-zA-Z\d]+\s(has\s[1-9][0-9])\srows.*columns/)
{
print "$_\n";
}
答案 1 :(得分:2)
使用简易正则表达式:
/Document has [0-9]+ row(s?) and [0-9]+ column(s?)/
如果s
仅在有多个行/列时使用
答案 2 :(得分:1)
我假设您要捕获数字。
if ( /^Document has (\d+) rows and (\d+) columns/ ) {
my $rows = $1;
my $cols = $2;
答案 3 :(得分:1)
my $line = "Document has 15 rows and 2 columns"
if ($line =~ /^Document has (\d+) rows? and (\d+) columns?/)
{
print "rows = $1\n";
print "cols = $2\n";
}
答案 4 :(得分:0)
如果您只想要行数,请使用:
if (/(\d+)\s+rows/) {
print "$1\n";
}
如果您想要行和列(并且它们始终按此顺序排列),请使用:
if (/(\d+)\s+rows\s+and\s+(\d+)\s+columns/) {
print "$1 rows and $2 columns\n";
}
如果您认为有必要,如果您需要:限制位数,强制非前导零等,则可以限制更多。
另外,我假设你要么在命令行上使用“-n”,要么绕过它。