正则 懒惰匹配 分组问题

qxyywy 2014-08-20 11:53:00
项目中需要用到正则处理一个字符规则
如:WC=[cad]#CAD[*](S=cad2[+]YC=1989-2013
  • A=cad3#CAD3
  • )

    需要用正则匹配出需要的数据 自己写的正则本来是可以了 但后期字符串改为上面格式 现在遇到一个懒惰匹配后 后面的分组无匹配
    分别匹配出KEY分组 :
    WC
    S
    YC
    A

    VAL 分组:
    cad
    cad2
    1989-2013
    cad3

    SHOWN分组:
    CAD


    CAD3

    OP分组:
    *
    +
    *

    注:逻辑操作符最后一个是没有的 ShowN 已经逻辑小括号 是可能会出现

    另外对val外层包有[] 有也需要做个处理 标示精确查找 逻辑小括号 也需要分别标示出来 本身对正则进行了更改 如下:

    (?<group>(?<prepar>[\(]*)(?<key>\w*)=(?<accurB>[\[])?(?<val>.*?)(?<accurE>[\]])?(#(?<showN>.*?))?(?<tailpar>\)*)\[(?<op>.)\])|((?<prepar>[\(]*)(?<key>\w*)=(?<accurB>[\[])?(?<val>.*?)(?<accurE>[\]])?(#(?<showN>.*?))?(?<tailpar>\)*))


    对如上字符匹配则出现问题
    如图:

    标红的(?<val>.*?)这个分组的懒惰匹配对后面的分组造成了影响 请各位看下 这儿如何处理
...全文
175 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qxyywy 2014-08-20
  • 打赏
  • 举报
回复
给出一个正则工具链接 http://download.csdn.net/detail/qxyywy/7789617
qxyywy 2014-08-20
  • 打赏
  • 举报
回复
(?<group>(?<prepar>[\(]*)(?<key>\w*)=(?<accurB>[\[])?(?<val>.*?)(?<accurE>[\]])?(#(?<showN>.*?))?(?<tailpar>\)*)\[(?<op>.)\])|((?<prepar>[\(]*)(?<key>\w*)=(?<accurB>[\[])?(?<val>.*?)(?<accurE>[\]])?(#(?<showN>.*?))?(?<tailpar>\)*)) 上面的正则居然被标红弄乱了
qxyywy 2014-08-20
  • 打赏
  • 举报
回复
只是自己对最上面提到的那个懒惰匹配有疑问 为什么加上懒惰之后 后面的所有分组都无法匹配
(?<group>(?<prepar>[\(]*)(?<key>\w*)=(?<accurB>[\[])?(?<val>.*?)(?<accurE>[\]])?(#(?<showN>.*?))?(?<tailpar>\)*)\[(?<op>.)\])|((?<prepar>[\(]*)(?<key>\w*)=(?<accurB>[\[])?(?<val>.*?)(?<accurE>[\]])?(#(?<showN>.*?))?(?<tailpar>\)*))
问题匹配正则
WC=[cad]#CAD[*](S=cad2[+]YC=1989-2013
  • A=cad3#CAD3
  • )正常匹配字符

    若是把匹配字符最后加上操作符如
    WC=[cad]#CAD[*](S=cad2[+]YC=1989-2013
  • A=cad3#CAD3
  • )

  • 匹配就没有任务问题 如图
qxyywy 2014-08-20
  • 打赏
  • 举报
回复
督察 那个正则确实花了不少时间 自己知道思路觉得分组还算清晰

M=[测试1]#ceshi[*](A=测试2[+]M=测(试)3)[*](ZY=8[+]ZY=2)
  • QK=4
  • YY=1989-2014
  • UT=1
    测试地址:http://192.168.20.192:8085
    注:精确查找的时候需要把值用
  • []包含起来 模糊不做其它处理
    上面传递的规则 key1=[val1]#showN1[op1](key2=[val2]#showN2[op2]key3=[val3]#showN3[op3])
    KEY:表达式缩写字母
    Val:传递的值(到底层的值)
    ShowN:前台页面显示的值 (主要针对聚类)
    OP:逻辑操作符
  • ,
  • [+],[!] 是条件逻辑关系 分别表示并且,或者,非

    自己和同事一起进行了改正 已达到效果
    (?<group>(?<prepar>[\(]*)(?<key>\w*)=(?<accurB>[\[])?(?<val>.*?)(?<accurE>[\]])?(#(?<showN>.*?))?(?<tailpar>\)*)\[(?<op>.)\])|((?<prepar>[\(]*)(?<key>\w*)=(?<accurB>[\[])?(?<val>[^\]#]*)(?<accurE>\])?(#)?(?<showN>[^\)]*)(?<tailpar>\)*)(\[(?<op>.)\])?)

q107770540 2014-08-20
  • 打赏
  • 举报
回复

//update
void Main()
{
	string s="WC=[cad]#CAD[*](S=cad2[+]YC=1989-2013
  • A=cad3#CAD3
  • )"; var reg=new Regex(@"(?i)(?<key>\w+)=(\[?(?<val>[^]#]+)\]?)(?<shown>#?[\w-]+)?((\[(?<op>[^]]+)\])|\))"); foreach(Match m in reg.Matches(s)) { Console.WriteLine("{0}:\t{1}","key",m.Groups["key"].Value); Console.WriteLine("{0}:\t{1}","val",m.Groups["val"].Value); Console.WriteLine("{0}:\t{1}","shown",m.Groups["shown"].Value.TrimStart('#')); Console.WriteLine("{0}:\t{1}","op",m.Groups["op"].Value); Console.WriteLine(); } /* key: WC val: cad shown: CAD op: * key: S val: cad2 shown: op: + key: YC val: 1989-2013 shown: op: * key: A val: cad3 shown: CAD3 op: */ }
q107770540 2014-08-20
  • 打赏
  • 举报
回复
你的正则写的太让人难以阅读了,我直接重新给你写了个,你看是不是你想要的:
void Main()
{
	string s="WC=[cad]#CAD[*](S=cad2[+]YC=1989-2013
  • A=cad3#CAD3
  • )"; var reg=new Regex(@"(?i)(?<key>\w+)=(\[?(?<val>[^]#]+)\]?#)?(?<shown>[\w-]+)((\[(?<op>[^]]+)\])|\))"); foreach(Match m in reg.Matches(s)) { Console.WriteLine("{0}:\t{1}","key",m.Groups["key"].Value); Console.WriteLine("{0}:\t{1}","val",m.Groups["val"].Value); Console.WriteLine("{0}:\t{1}","shown",m.Groups["shown"].Value); Console.WriteLine("{0}:\t{1}","op",m.Groups["op"].Value); Console.WriteLine(); } /* key: WC val: cad shown: CAD op: * key: S val: shown: cad2 op: + key: YC val: shown: 1989-2013 op: * key: A val: cad3 shown: CAD3 op: */ }
q107770540 2014-08-20
  • 打赏
  • 举报
回复
你没有说清楚我的匹配规则

1,979

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 其他语言讨论
社区管理员
  • 其他语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧