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

由于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次

    原文作者:五大RobertWu伍洋
    原文地址: https://www.jianshu.com/p/f91f6b440566
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞