正则表达式 基础到深入--进阶一,如何实现最近匹配?

由于AHk小猛最近在学习正则并用于AHK项目,讨论了一下reg问题以改进originalreg。感觉对自己有种从以前的基础会用到有新的理解和收获的状态。

source : [{Hotkey=,p:p,v:v,h:h}{00000804}{1}][{Hotkey=,u:u}{00000804}{1}]

original reg : \[.{9}u.*\]

result : [{Hotkey=,u:u}{00000804}{1}]

---------------------------------------------------------------

1. 先是想到把结果看做俩个 "[ ]"对组成的两组,现在取第二组的值(当然要根据内容特征取某一组)。

source : [{Hotkey=,p:p,v:v,h:h}{00000804}{1}][{Hotkey=,u:u}{00000804}{1}]

reg in notepad++ : \[{H\w+=,u.*\]

result : [{Hotkey=,u:u}{00000804}{1}]

开始以为 \w只是代表小写字母,所以保留大写字母内容H。

然后使用=,u作为内容特征识别值。最后 .*以最偷懒的方式结束匹配。

思考:如果直接要去取第二组的值呢,怎么实现呢? --》见 2. (2)

2.基于上述reg,马上测试有了如下产生同样结果的reg:

(1) \[{\w+=,u.*\] -- 》 \w 表示 字母 不区分大小写

(2) 匹配p。发现p后面不好写啊,如果用 .* 会一直匹配到结束: (\[{\w+=,p.*\])

所以用了 (\[{\w+=,p.*\])(\[.*\])然后去取第一组 $1。

(3) 现在感觉出来了,为了在匹配p的时候,匹配 最近 的 ] 作为结束符,必须得查文档看看有没有什么方式实现了。

3.最后看了网上不少讨论后,发现如下reg可以最近匹配!

(\[{\w+=,p[^\]]*\]) -- > 匹配p的最近原则 (即第一组)

\[{\w+=,u[^\]]*\] -- > 匹配u的最近原则 (即第二组)

主要作用是^,取最近的结束符的反。所以只会去到最近的匹配结束符!

Note : 正常的匹配是两边向内^是向外。 ——》 by AHK小猛

4.需要继续学习的。

还看到一个这样的 a[^a]*(?=23)

ffasdfasdfasklfjsakldfjlsajf23klasjdfasl23asas23sdf

还没搞明白。

?=Pattern 见过两次 但是不知道啥意思。 -- 》 零宽断言 , by AHK小猛

Note: (?=exp) 匹配exp前面的位置

然后就看到上述与 固化分组非常像!

http://www.ithao123.cn/content-2815561.html

顺序肯定环视:(?=Expression),表示所在位置右侧能够匹配Expression

顺序否定环视:(?!Expression),表示所在位置右侧不能匹配Expression

逆序肯定环视:(?<=Expression),表示所在位置左侧能够匹配Expression

逆序否定环视:(?<!Expression),表示所在位置左侧不能匹配Expression

5.马上试错+验证:

\[{\w+=,p.*(?=\])      -- 》 这个匹配p还是不好,不是最近匹配,还不知道怎么用 4 去实现最近匹配 。

source : [{Hotkey=,p:p,v:v,h:h}{00000804}{1}][{Hotkey=,u:u}{00000804}{1}]

reg : \[{\w+=,p.*(?=\])

result : [{Hotkey=,p:p,v:v,h:h}{00000804}{1}][{Hotkey=,u:u}{00000804}{1}

-------------------------------------------------------------

终于试出来了 一种环视方式

source : [{Hotkey=,p:p,v:v,h:h}{00000804}{1}][{Hotkey=,u:u}{00000804}{1}]

reg : \[{\w+=,p.*(?=\[)

result: [{Hotkey=,p:p,v:v,h:h}{00000804}{1}]

因为"["结束符右侧是],所以.*匹配到有右侧[的地方就停止。

但应该还可以改进吧。因为用.*去匹配还是太危险了。比如,

source :

[{Hotkey=,p:p,v:v,h:h}{00000804}{1}][{Hotkey=,u:u}{00000804}{1}][{Hotkey=,u:u}{00000804}{1}]

所以感觉不用对结束符]取反,基本不可能实现最近匹配

目前还是用 \[{\w+=,p[^\]]*\]匹配p组。

-------------------------------------------------------------

source : [{Hotkey=,p:p,v:v,h:h}{00000804}{1}][{Hotkey=,u:u}{00000804}{1}]

reg : \[{\w+=,u.*(?=\])

result : [{Hotkey=,u:u}{00000804}{1}

---------------------------------------------------------------

6.整理 :

(1) \[{\w+=,u[^\]]*\] -- 》 这样目前是可以达到最近匹配的。

[{Hotkey=,p:p,v:v,h:h}{00000804}{1}][{Hotkey=,u:u}{00000804}{1}]

还要 取 v:v h:h 啊? 我是获取匹配 p的[]内容 或者v,h 。

(2) http://www.ithao123.cn/content-2815561.html

这上面那个软件 截图是 regtester 吗? 你可以用那上面的软件 -- > 不是RegexTester

(3) 特征中含有:,匹配时可以用 \:也可以直接用 :

source : [{Hotkey=:u}{00000804}{1}]

reg : \[{\w+=\:u.*\]

reg : \[{\w+=:u.*\]

result : [{Hotkey=:u}{00000804}{1}]

都可以

source : [{Hotkey=u:u}{00000804}{1}]

reg : \w+=\w:

result : Hotkey=u:

(4) 我明白你的“土话” 是什么意思了 :

Note : 正常的匹配是两边向内^是向外。 ——》 by AHK小猛

首先是逆序肯定环视表示左边必须是数字;其次是逆序否定环视表示左边不能有小数点符号 -- >来自上述url讨论给数字添加美国的","读数分割符。

这个理解 强大..

总结:感觉如果不对结束标志符取反,基本不可能实现最近匹配。环视也试出来了一种,怀疑要想实现最近匹配还是要"取反"。

------------------------第二次补充 -----------------------------

发现惰性模式匹配可以解决 最近匹配的需求

source : [{Hotkey=,p:p,v:v,h:h}{00000804}{1}][{Hotkey=,u:u}{00000804}{1}][{Hotkey=,u:u}{00000804}{1}]

reg : \[{\w+=,p.*?\]

result : [{Hotkey=,p:p,v:v,h:h}{00000804}{1}]

--------------------------------------------------------------------

当使用贪婪模式的时候,”.*”会最大程度地进行字符匹配,所以输出了整个字符串。而在惰性模式中,”.*?”只进行最小限度的匹配,所以完整的输出了我们需要的字符串。

惰性模式的语法很简单,即是在贪婪模式后面加上一个“?”即可。

* –> *?

+ –> +?

{n,} –> {n,}?

------------------------------------------

惰性匹配,可参见 如下文章。

简书 《JS正则表达式难点突破:贪婪模式/惰性模式》:

http://www.jianshu.com/p/889f3885a5bd

正则入门:惰性匹配 : (可以看出惰性匹配保存了多组结果,所以上述"第二次补充"显示了最近匹配结果是因为没有重复的惰性匹配组)

http://www.nowamagic.net/librarys/veda/detail/1038

Java正则之贪婪匹配、惰性匹配 :

http://www.jb51.net/article/62876.htm

正则总结:JavaScript中的正则表达式

http://www.nowamagic.net/librarys/veda/detail/1283

贪婪量词:

先看整个字符串是不是一个匹配。如果没有发现匹配,它去掉最后字符串中的最后一个字符,并再次尝试。如果还是没有发现匹配,那么 再次去掉最后一个字符串,这个过程会一直重复直到发现一个匹配或者字符串不剩任何字符。简单量词都是贪婪量词。

惰性量词:

先看字符串中的第一个字母是不是一个匹配,如果单独着一个字符还不够,就读入下一个字符,组成两个字符的字符串。如果还没有发现匹配,惰性量词继续从字符串中添加字符直到发现一个匹配或者整个字符串都检查过也没有匹配。惰性量词和贪婪量词的工作方式恰好相反。

支配量词:

只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步尝试。

贪婪量词 惰性量词 支配量词 描述

-------------------------------------------------------------------------------------

? ?? ?+ 可以出现0次或1次,但至多出现1次

* *? *+ 可以出现任意次,也可以不出现

+ +? ++ 出现1次或多次,但至少出现1次

{n} {n}? {n}+ 一定出现n次

{n,m} {n,m}? {n,m}+ 至少出现n次,但至多不能超过m次

{n,} {n,}? {n,}+ 可以出现任意次,但至少出现n次

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容