Chinaunix

标题: 急!求救一个perl多行正则匹配问题 [打印本页]

作者: litaosmile    时间: 2009-09-23 18:02
标题: 急!求救一个perl多行正则匹配问题
标量是一个多行的字符串.现在想匹配到 haha@163.com.cn
和SetEnv SINASRV_DB_NAME searchbetav 里面的这个数据库的名字:searchbetav
(把这些放入一个文件中一行行匹配我会,这里要希望从一个标量匹配)
我写的匹配:
my $dbname='searchbetav';
if ($aa=~m/ServerAdmin\s+(\w+\d*\@staff\.sina\.com\.cn).*?(SetEnv.*SINASRV.*DB.*NAME\s+)($dbname$)/s)
{
print "$1*\n";
print "$2**\n";
print "$3***\n";
print "$4====\n";
}
各位高手给看看有上面问题 ,怎么才能把两个匹配上.

$aa='ServerName search.beta.v.sina.com.cn
ServerAlias search.video.sina.com.cn

ServerAdmin haha@163.com.cn
DocumentRoot /data1/www/htdocs/search.beta.v.sina.com.cn/
ErrorLog /data1/www/logs/search.video.sina.com.cn-error_log
CustomLog /data1/www/logs/search.video.sina.com.cn-access_log

SetEnv SINASRV_DATA_DIR "/data1/www/data/search.beta.v.sina.com.cn/"
SetEnv SINASRV_CACHE_DIR "/data1/www/cache/search.beta.v.sina.com.cn/"
SetEnv SINASRV_PRIVDATA_DIR "/data1/www/privdata/search.beta.v.sina.com.cn/"
SetEnv SINASRV_APPLOGS_DIR "/data1/www/applogs/search.beta.v.sina.com.cn/"

SetEnv SINASRV_DATA_URL "http://search.beta.v.sina.com.cn/data"
SetEnv SINASRV_CACHE_URL "http://search.beta.v.sina.com.cn/cache"

#SetEnv SINASRV_NDATA_DIR "/datanfs1/sinasrv/www/ndata/search.beta.v.sina.com.cn/"
SetEnv SINASRV_NDATA_CACHE_URL "http://cache.mars.sina.com.cn/nd/searchbetav/"

SetEnv SINASRV_DB_HOST m3380i.mars.grid.sina.com.cn
SetEnv SINASRV_DB_HOST_R s3380i.mars.grid.sina.com.cn
SetEnv SINASRV_DB_PORT 3380
SetEnv SINASRV_DB_NAME searchbetav
SetEnv SINASRV_DB_USER searchbetav
SetEnv SINASRV_DB_PASS 1wSeH45tGc
SetEnv SINASRV_DB_PORT_R 3380
SetEnv SINASRV_DB_NAME_R searchbetav
SetEnv SINASRV_DB_USER_R searchbetav_r
SetEnv SINASRV_DB_PASS_R T5Gbv3edC45f

SetEnv SINASRV_MEMCACHED_KEY_PREFIX "search_beta_v-"';
作者: iceberg77    时间: 2009-09-23 18:12
标题: 回复 #1 litaosmile 的帖子
增加一修饰词
$aa=~ m/.../sm
作者: litaosmile    时间: 2009-09-23 18:40
if ($array[100]=~m/ServerAdmin\s+(\w+\d*\@staff\.sina\.com\.cn).*?(SetEnv.*SINASRV.*DB.*NAME\s+)($dbname$)/ms)
大哥这样还是不行!
作者: litaosmile    时间: 2009-09-23 18:40
先找一个 然后再找到一个的情况下再去找另一个.可以解决.那样需要匹配两次.想知道用一个正则怎么匹配.
作者: dugu072    时间: 2009-09-23 18:47
看了半天,终于有点明白lz的意思了,lz是说对于文件的一行一行匹配没问题,但是 $aa 中的内容,没法按行读取了,如何找出一个邮箱和数据库名?是这个理解的话:
对于/m只能在一定程度上解决多行匹配的问题,必须^ /$结合使用,不怎么推荐,split 转化为自己会的方式,不更好?

my @aa = split("\n", $aa); #注意你的文本是 /r/n 还是  /n
foreach (@aa) {
   if ($str =~/xxx/) {
      print "xxx\n";
   }
}
作者: dahe_1984    时间: 2009-09-23 19:05
我也试了一下,好像匹配没有发生。
不知道咋回事了?
作者: litaosmile    时间: 2009-09-23 19:13
原帖由 dugu072 于 2009-9-23 18:47 发表
看了半天,终于有点明白lz的意思了,lz是说对于文件的一行一行匹配没问题,但是 $aa 中的内容,没法按行读取了,如何找出一个邮箱和数据库名?是这个理解的话:
对于/m只能在一定程度上解决多行匹配的问题,必 ...

恩 这个方法不错!谢谢了
作者: blackold    时间: 2009-09-24 10:04
标题: 回复 #1 litaosmile 的帖子
$aa里面没有staff啊,如何匹配?
作者: dahe_1984    时间: 2009-09-24 11:09
if ($aa=~m/^ServerAdmin.*?\s([\w]+\@163\.com\.cn).*?(SetEnv.*)?($dbname)/mgs)
不知道你中间(SetEnv.*SINASRV.*DB.*NAME\s+)想匹配什么?

应该加上m,/s只能让.匹配\n。
作者: litaosmile    时间: 2009-09-24 13:26
原帖由 dahe_1984 于 2009-9-24 11:09 发表
if ($aa=~m/^ServerAdmin.*?\s([\w]+\@163\.com\.cn).*?(SetEnv.*)?($dbname)/mgs)
不知道你中间(SetEnv.*SINASRV.*DB.*NAME\s+)想匹配什么?

应该加上m,/s只能让.匹配\n。

SetEnv SINASRV_DB_HOST m3380i.mars.grid.sina.com.cn
SetEnv SINASRV_DB_HOST_R s3380i.mars.grid.sina.com.cn
SetEnv SINASRV_DB_PORT 3380
SetEnv SINASRV_DB_NAME searchbetav
SetEnv SINASRV_DB_USER searchbetav
SetEnv SINASRV_DB_PASS 1wSeH45tGc
SetEnv SINASRV_DB_PORT_R 3380
SetEnv SINASRV_DB_NAME_R searchbetav
SetEnv SINASRV_DB_USER_R searchbetav_r
SetEnv SINASRV_DB_PASS_R T5Gbv3edC45f

这个只是其中一个,还有很多类似于SINASRV_DB_NAME样子的 ,比如SINASRV_DB2_NAME等
作者: litaosmile    时间: 2009-09-24 13:27
原帖由 blackold 于 2009-9-24 10:04 发表
$aa里面没有staff啊,如何匹配?

由于某些原因我把邮件换了下,sorry
作者: litaosmile    时间: 2009-09-24 13:34
原帖由 dahe_1984 于 2009-9-24 11:09 发表
if ($aa=~m/^ServerAdmin.*?\s([\w]+\@163\.com\.cn).*?(SetEnv.*)?($dbname)/mgs)
不知道你中间(SetEnv.*SINASRV.*DB.*NAME\s+)想匹配什么?

应该加上m,/s只能让.匹配\n。



你这个貌似也匹配不到~~
作者: litaosmile    时间: 2009-09-24 13:37
原帖由 dugu072 于 2009-9-23 18:47 发表
看了半天,终于有点明白lz的意思了,lz是说对于文件的一行一行匹配没问题,但是 $aa 中的内容,没法按行读取了,如何找出一个邮箱和数据库名?是这个理解的话:
对于/m只能在一定程度上解决多行匹配的问题,必 ...

因为我之前取出这个$aa也是由for 循环取的,现在又加一个循环(其实$aa也不只这几行),效率应该不高,
其实只要找个方法回溯就能很好解决我的问题.
作者: blackold    时间: 2009-09-24 15:39
可以匹配的。
作者: litaosmile    时间: 2009-09-24 17:49
标题: 回复 #14 blackold 的帖子
帮忙写个出来 黑哥
作者: dahe_1984    时间: 2009-09-24 17:58
这个是你想要的还是你想匹配出所有的SINASRV[\_|w]+    ?

#!/usr/bin/perl

use strict;

my $aa='ServerName search.beta.v.sina.com.cn
ServerAlias search.video.sina.com.cn

ServerAdmin haha@163.com.cn
DocumentRoot /data1/www/htdocs/search.beta.v.sina.com.cn/
ErrorLog /data1/www/logs/search.video.sina.com.cn-error_log
CustomLog /data1/www/logs/search.video.sina.com.cn-access_log

SetEnv SINASRV_DATA_DIR "/data1/www/data/search.beta.v.sina.com.cn/"
SetEnv SINASRV_CACHE_DIR "/data1/www/cache/search.beta.v.sina.com.cn/"
SetEnv SINASRV_PRIVDATA_DIR "/data1/www/privdata/search.beta.v.sina.com.cn/"
SetEnv SINASRV_APPLOGS_DIR "/data1/www/applogs/search.beta.v.sina.com.cn/"

SetEnv SINASRV_DATA_URL "http://search.beta.v.sina.com.cn/data"
SetEnv SINASRV_CACHE_URL "http://search.beta.v.sina.com.cn/cache"

#SetEnv SINASRV_NDATA_DIR "/datanfs1/sinasrv/www/ndata/search.beta.v.sina.com.cn/"
SetEnv SINASRV_NDATA_CACHE_URL "http://cache.mars.sina.com.cn/nd/searchbetav/"

SetEnv SINASRV_DB_HOST m3380i.mars.grid.sina.com.cn
SetEnv SINASRV_DB_HOST_R s3380i.mars.grid.sina.com.cn
SetEnv SINASRV_DB_PORT 3380
SetEnv SINASRV_DB_NAME searchbetav
SetEnv SINASRV_DB_USER searchbetav
SetEnv SINASRV_DB_PASS 1wSeH45tGc
SetEnv SINASRV_DB_PORT_R 3380
SetEnv SINASRV_DB_NAME_R searchbetav
SetEnv SINASRV_DB_USER_R searchbetav_r
SetEnv SINASRV_DB_PASS_R T5Gbv3edC45f

SetEnv SINASRV_MEMCACHED_KEY_PREFIX "search_beta_v-"';

my $dbname='searchbetav';
if ($aa=~m/^ServerAdmin.*?\s([\w]+\@163\.com\.cn).*?(SINASRV[\_|\w]+)\s.*?($dbname)$/ms)
{
print "$1*\n";
print "$2**\n";
print "$3***\n";
print "$4====\n";
}
作者: lastfile    时间: 2009-09-24 20:50
好长好复杂啊
作者: keenray    时间: 2009-09-26 12:13
问题关键是 \n,
如,下面的匹配
$aa =~ /ServerAdmin\s+([^\n]*)\n.*SetEnv\s+SINASRV_DB_NAME\s+($dbname)/s;
和结果为:

$1 = haha@163.com.cn
$2 = searchbetav




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2