1

所以我有一个只想查找 2 个单词的正则表达式 - 一行上只有一个单词会出错,超过三个单词会踢出它并给我一个行号(这就是我想要的)。

#!/usr/bin/perl
use warnings 
use strict 

open( my $filehandle ,"<", "/tmp/compare.cleartxt.tmpusers" ) || die "cant access the file" ;
    while (<$filehandle>) {
        if ($_ !~ /^\w+\s\w+$/) {
        print "LINE $., error on $_ " ;
        }
}

问题是其中一些单词包含“$”符号。喜欢

LINE 700, error on ubs$iontest ubs$iontest
LINE 904, error on uho$jptest uho$jptest uho$jptest
LINE 1929, error on boa$jgb boa$jgb
LINE 2976, error on mitadel mitadel mitadel$001
LINE 3205, error on csfb csfb csfb$jpntest csfb$001 csfb$nytest
LINE 4762, error on mitsi$jgb2 mitsub$jgb2
LINE 6346, error on GOLDSTPTG GOLDSTPTG GOLDSTPTG
LINE 6660, error on jptest mizuho$jptest jptest

所以我想去掉第 700 行或第 1929 行中的误报,但保留第 904 行之类的错误。

我厌倦了使用它,但它出现了更多错误,就像它打印的每个单词都带有一个下划线,比如“foo_bar”

if ($_ !~ /^[a-zA-Z$0-9]+\s[a-zA-Z$0-9]+$/)  
4

2 回答 2

4

\w不匹配$,因为$不被视为单词字符。

用 Perl 术语来说,您想要匹配的内容似乎是单词字符$字符。

尝试替换\w[\w\$]. (您需要转义,$因此它不会被$]视为变量引用。)

如果要匹配非空白字符序列,\S将匹配任何单个非空白字符。这包括所有单词字符和$; 它还包括其他标点符号。

我刚刚注意到您在问题中写的其他内容:

我厌倦了使用它,但它出现了更多错误,就像它打印的每个单词都带有一个下划线,比如“foo_bar”。

Perl 对“单词字符”的定义是:

字母数字加上“_”,加上其他连接符标点字符加上 Unicode 标记

因此下划线_ 被视为单词字符。听起来您想匹配字母 and $,但不是_。数字呢?其他标点符号?重音字母和非拉丁字母?

一旦你准确地指定了你想要匹配的内容,构建一个可以完成这项工作的正则表达式就会容易得多。

请参阅此处或尝试perldoc perlre获取有关 Perl 正则表达式的更多信息。

于 2013-11-14T23:09:28.167 回答
1

您可以使用:

/^[\w$]+\s[\w$]+$/
于 2013-11-14T23:12:38.830 回答