免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4257 | 回复: 19
打印 上一主题 下一主题

看一下這個正則表達式(還沒完全解決,見1樓) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-17 11:30 |只看该作者 |倒序浏览
本帖最后由 ztkx 于 2010-08-20 16:52 编辑

需要匹配的是xxxXX, x is [a-zA-Z0-9],首字母不為數字,XX為一特定的單詞

最先想到的是lookingbehind,但是似乎只能在前面定長的情況下,比如foo(?=bar)
如果我想匹配fobar,foobar,lsbar等等怎麽辦

當然只是一個獨立的單詞好辦,問題是這是一個字符串的一部分,所以沒法用bar$

thanks for help

還有一些疑問,對於這樣一個dn
  1. my $dn = "cn=admin, ou=10HH,ou=JCAC,ou=CCXX,ou=ooCA,ou=XXCA,ou=RootCA";
复制代码
  1. my $dn_re = '^(cn\s*=\s*\w+)\s*,\s*
  2. ((ou\s*=\s*\w*?(?!CA)\b\s*,\s*)*?)
  3. ((ou\s*=\s*\w*CA\b\s*,\s*)*?)
  4. (ou\s*=\s*RootCA)';
复制代码
這個表達式的匹配是正確的

  1. $1 = cn=admin
  2. $2 =  ou=10HH,ou=JCAC,ou=CCXX,
  3. $4 = ou=ooCA,ou=XXCA,
  4. $6 = ou=RootCA
复制代码
但是這個就不對了
  1. my $dn_re = '^(cn\s*=\s*\w+)\s*,\s*
  2. ((ou\s*=\s*\w*?(?!CA)\b\s*,\s*)*)
  3. ((ou\s*=\s*\w*[b](?=CA)[/b]\b\s*,\s*)*)
  4. (ou\s*=\s*RootCA)';
复制代码
使用?=斷言或者沒有對二、四組使用非貪婪模式,都回導致匹配錯誤,這時候

  1. $2 = ou=10HH,ou=JCAC,ou=CCXX,ou=ooCA,ou=XXCA,
  2. $4 = undef
  3. $6 = ou=RootCA
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-08-17 11:49 |只看该作者
回复 1# ztkx


    bar\b

论坛徽章:
0
3 [报告]
发表于 2010-08-17 12:35 |只看该作者
回复 2# guap514

不好意思,寫錯了我不該寫$的,具體是這樣

ou=xxxx,ou=xxxx,ou=xxxCA,ou=xxxxCA,

沒辦法,以前的系統是這麽寫的,所以我現在要把CA域分離出來,like ou=xxxCA,ou=xxxxCA,
ou的個數不固定,xxx的位數也不固定

论坛徽章:
0
4 [报告]
发表于 2010-08-17 12:40 |只看该作者
my $str = "ou=xxxx,ou=xxxx,ou=xxxCA,ou=xxxxCA";
while ($str =~ /(ou=[a-zA-Z]\w*CA)/g)
{
        print $1, "\n";
}

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
5 [报告]
发表于 2010-08-17 12:42 |只看该作者
split一下不是可以用\b了

论坛徽章:
0
6 [报告]
发表于 2010-08-17 12:46 |只看该作者
回复 4# 黑色阳光_cu

謝謝,如果xxxx内部包含CA呢, like ou=ACAD, or ou=DCANUCA

论坛徽章:
0
7 [报告]
发表于 2010-08-17 13:05 |只看该作者
本帖最后由 黑色阳光_cu 于 2010-08-17 13:12 编辑

#!/bin/env perl

use strict;
use warnings;

my $str = "ou=xxxx,ou=xxxx,ou=xxxCA,ou=xxxxCA, ou=ACAD, ou=DCANUCA";
while ($str =~ /(ou=[a-zA-Z]\w*CA)\b/g)
{
        print $1, "\n";
}

论坛徽章:
0
8 [报告]
发表于 2010-08-17 13:12 |只看该作者
thanks

论坛徽章:
0
9 [报告]
发表于 2010-08-17 13:54 |只看该作者
while ($str =~ /(ou=[a-zA-Z]\w*CA)$/g;
为什么换成这样就只能打印出ou=DCANUCA
$不是正则表达式里的字符串结束么

论坛徽章:
0
10 [报告]
发表于 2010-08-17 14:13 |只看该作者
本帖最后由 ztkx 于 2010-08-17 14:22 编辑

  1. my $ca_re = '((ou=\w*CA\B)*)((\,ou=\w*CA\b)*)';
  2. my $ca = 'ou=NCAC,ou=CACA,ou=LDNCACCA';

  3. my @matched_arr = $ca =~ /$ca_re/;
  4. for (0..$#matched_arr) {
  5.         if ($matched_arr[$_]) {
  6.         print $_."=".$matched_arr[$_]."\n";
  7. }

复制代码
output:

  1. 0=ou=NCA
  2. 1=ou=NCA
  3. 10=,ou=CACA,ou=LDNCACCA
  4. 11=,ou=LDNCACCA
复制代码
0,1匹配值不對,10,11,有這麽多分組麽

g是做什麽用的,這裡沒有多次匹配的問題啊,但如果不加g,則只能匹配0,1分組,也即
  1. ((ou=\w*CA\B)*)
复制代码
sorry ,這樣做不對,我再改改先
  1. my $ca_re = '((ou=\w*(?!CA)\b)*)((\,ou=\w*CA\b)*)';
复制代码
ok了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP