检查字符串的特定部分是否与Perl中的另一个字符串匹配

时间:2014-11-04 23:11:54

标签: regex perl

我有一个输入文件,不能格式错误,我只想检查并看到文件格式正确,然后再继续计算程序。对于这个输入文件,逐行读取它将起作用,因为我只需要检查每一行的开头。

INPUT.TXT:

Data1: 30
Data2: 20
Data3: 50

基本上,我想逐行阅读,并检查每一行是否以" Data1开始:"或"数据2:"或者"数据3:",没有别的。换句话说,我可以假设那些之后的内容将是一个整数(在本应用程序的上下文中,没有办法不存在)。但是,如果该行的开头并没有从其中一个开始,那么我需要立即停止以避免混淆任何东西。

我认为我需要使用索引函数,并检查此子字符串的索引是否位于位置0(即在行的最开头)。或者,也许我需要使用正则表达式。

尝试编号1:

if (index($str, $substr) == 0) {
    print "$str contains $substr\n";
}

尝试1号错了。这让事情变得复杂了。我应该在这里使用正则表达式。

尝试编号2:

open my $in, '<', 'in.txt';
$iteration = 0
while(<$in>){
    chomp;
    next if /\s*(?:#|$)/;  //Skip over lines starting with # or empty lines.
    if($iteration==0) {
        die "Error in file formatting!\n" unless /^Data1: [a-Z]+/;
        my ($data1) = /Data[1]: ([a-z0-9-]+)\s*/; 
        $iteration++;
    }
    else if($iteration==1) {
        die "Error in file formatting!\n" unless /^Data2: \d+/;
        my ($data2) = /Data[2]: (\d+)/;
        $iteration++;

    }
    else if($iteration==2) {
        die "Error in file formatting!\n" unless /^Data3: \d+/;
        my ($data3) = /Data[3]: (\d+)/;
        $iteration=0;

    }
}

2 个答案:

答案 0 :(得分:1)

假设当前行在$_

/^Data[123]: \d+/ or die;

将检查字符串以Data开头,1到3之间的数字,冒号,空格和正整数。

如果您的行位于$str,并且您需要错误消息,则语法为:

$str =~ /^Data[123]: \d+/ or die "Invalid line: $str";

如果需要提取值,请将模式更改为:

/^Data([123]): (\d+)/

匹配后,值将位于$1$2变量中。

跳过评论行会很简单:

next if /^\s*(?:#|$)/;

这将检查该行的第一个非空白字符是#还是该行为空。

答案 1 :(得分:1)

使用索引是实现我认为你之后的一种混乱方式。这将读入您的文件,并逐行处理,如果一行不以数据1&#39;,&#39;数据2&#39;开头,则退出循环。或者&#39; Data3&#39; (印刷品只是说明了这一点):

use strict;
use warnings;

open my $in, '<', 'in.txt';

    while(<$in>){
    chomp;
    next if /^#/; # Will skip the line if it begins with #
    my ($number) = /Data[123]: (\d+)/; # Assigns the integer that follows Data1/2/3 to the scalar `$number`
    die unless /^Data[123]/; # Exit loop if line doesn't begin with Data1/2/3
    print "$number\n";
}