perl regex“\ w”不接受“$”

时间:2013-11-14 23:04:29

标签: regex perl

所以我有一个只需要查找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]+$/)  

2 个答案:

答案 0 :(得分:4)

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

在Perl术语中,您希望匹配的内容 $个字符。

尝试将\w替换为[\w\$]。 (您需要转义$,以便它不会将$]视为变量引用。)

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

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

  

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

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

  

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

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

一旦指定完全您想要匹配的内容,构建一个能够完成工作的正则表达式将会容易得多。

有关Perl正则表达式的详细信息,请参阅here或尝试perldoc perlre

答案 1 :(得分:1)

您可以使用:

/^[\w$]+\s[\w$]+$/