V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
n00b1
V2EX  ›  问与答

正则表达式太难了...能推荐些针对小白写的很好的教程吗

  •  
  •   n00b1 · 2013-01-16 14:26:23 +08:00 · 8421 次点击
    这是一个创建于 4365 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我在看这个视频,一头雾水啊
    第 1 条附言  ·  2013-01-16 16:17:40 +08:00
    不知道有没有‘反向生成正则’的服务呢?给一段目标文档内容,同时给出希望从其中找到的内容,改服务自动生成正则
    23 条回复    2019-03-21 19:35:34 +08:00
    046569
        1
    046569  
       2013-01-16 14:27:14 +08:00   ❤️ 2
    试试这个,希望对你有用.
    http://deerchao.net/tutorials/regex/regex.htm#ad
    n00b1
        2
    n00b1  
    OP
       2013-01-16 14:31:41 +08:00
    @046569 30分钟入门?我马上开始!感谢
    haiyang416
        3
    haiyang416  
       2013-01-16 15:02:38 +08:00   ❤️ 9
    学习一样新事物时应该从最基本的地方开始,不要被正则的各种符号所迷惑,正则的规则其实很简单。

    我们通常使用正则来描述语言,比如“hello”,因此你可以把正则看成一个集合,例如:空集合为{}(一般记作ε),一个字母集合为{a}。

    正则是最基本的运算规则只有三条:

    1.并运算,记作 X|Y,你可以理解为加法。例如a|b所表示的集合为{a,b}
    2.连接运算,记作XY,你可以理解为乘法。例如X为a|b,Y为c|d,那么XY的集合为{ac,ad,bc,cd}
    3.克林闭包运算(Kleene Closure),记作X*,你可以理解为零个或者多个X连接。例如a*所表示的集合为{ε,a,aa,aaa,......}

    现在你已经了解正则的全部规则了,那些复杂的规则你可以看作是语法糖,都可以用这三个规则来描述。举几个例子:

    1.hello,即5个字母的连接运算:hello
    2.[ab],即为ab两个字母的并运算:a|b
    3.[0-9],即为并运算0|1|2|3|4|5|6|7|8|9
    4.A?,即为并运算A|ε
    5.A+,即为AA*
    adspe
        4
    adspe  
       2013-01-16 15:29:45 +08:00
    上Youtube看吧。一语点醒梦中人。
    jkeylu
        5
    jkeylu  
       2013-01-16 15:34:25 +08:00   ❤️ 1
    这个工具也蛮有用的

    http://www.regexper.com/
    jiangpeng
        6
    jiangpeng  
       2013-01-16 15:39:31 +08:00
    余晟的《正则指引》不知如何
    http://book.douban.com/subject/10591096/
    n00b1
        8
    n00b1  
    OP
       2013-01-16 15:43:21 +08:00
    @xavierskip 这个图真太好了,感谢~
    n00b1
        9
    n00b1  
    OP
       2013-01-16 16:09:51 +08:00
    @046569
    @haiyang416
    @adspe
    @jkeylu
    @jiangpeng
    @xavierskip

    不知道有没有‘反向生成正则’的服务呢?给一段目标文档内容,同时给出希望从其中找到的内容,改服务自动生成正则
    bitsmix
        10
    bitsmix  
       2013-01-16 16:13:48 +08:00
    买本猫头鹰就够了
    bitsmix
        11
    bitsmix  
       2013-01-16 16:17:56 +08:00
    刚看视频。。用python做入门讲解。。怎么说呢……
    视频内容里面掺杂太多了和 正则 本身无关的内容了(比如 python 的re里面 有什么方法)
    还是买本猫头鹰看吧

    http://book.douban.com/subject/2154713/
    nervouna
        12
    nervouna  
       2013-01-16 16:30:15 +08:00
    和我一样的初学者,只需要了解正则解决问题的基本思路,语法知道个大概就可以了。等到真正要用的时候,再具体问题具体分析,网上找找例子,看看别人的思路是怎样的。这样可能会更好。
    Sunyanzi
        13
    Sunyanzi  
       2013-01-16 17:18:17 +08:00
    正则基本就是死记硬背 ... 学基础的匹配半小时真就够了 ...

    正则里所有比较麻烦的东西都以 (? 开头 ...

    比如 Assertions 和比较复杂的 Subpatterns 这一类东西 ...

    看到就直接跳过好了 ... 先学会简单匹配然后在使用中再慢慢看都来得及 ...

    另外你提到了反向正则生成服务 ... 我琢磨了一下要不要自己写一个 ...

    但有个严重的问题是你要提供怎样的输入呢 ..?

    比如你输入了一段很长的文字 ... 例如 abcdefgh123456 ...

    然后你希望从中匹配到 cde ... 我生成的正则一定是 /cde/ ...

    如果你希望描述匹配 d 到 1 之间这整段内容 ... 那么你要如何描述 ..?

    /d.*1/ 这样么 ..? 这本身就已经是正则了 ...

    或者我提供语法类似 ...

    d[anything][anylength][word|numberic][length=1]

    然后我把它翻译成 /d.*[a-z0-9]{1}/ 这样你觉得有意义么 ..?
    jimbinc
        14
    jimbinc  
       2013-01-16 17:21:17 +08:00
    正则指引,一本搞定
    ThunderEX
        15
    ThunderEX  
       2013-01-16 17:23:29 +08:00 via Android
    不可能有这种服务吧。
    对正则来说,怎么匹配不是问题。真正的问题是怎么排除。
    pepsin
        16
    pepsin  
       2013-01-16 17:27:39 +08:00
    请用www.rubular.com自己多试验。Mac下也可使用Reggy做试验。
    sivacohan
        18
    sivacohan  
       2013-01-16 18:23:08 +08:00 via Android
    正则也要看看(),这里面有个东西叫反向引用。
    python 的re模块提供了?P <name >,使用groupdics,可以获得一个字典,很好用。
    加上@haiyang416 的,基本正则就可以用了,只不过写的比较长而已。
    如果对正则的性能有需求,建议看看精通正则表达式,和你使用正则时候的语言。
    freefcw
        19
    freefcw  
       2013-01-16 18:26:19 +08:00
    @jiangpeng 正则指引有比较深入的东西,还不错。个人觉得正则表达式很适合入门刚开始
    Mutoo
        20
    Mutoo  
       2013-01-16 20:00:06 +08:00
    mozillazg
        21
    mozillazg  
       2013-01-17 09:34:34 +08:00
    RegexBuddy( http://www.regexbuddy.com/ ):调试正则的利器
    wuhaochen999
        22
    wuhaochen999  
       2019-02-08 21:39:00 +08:00
    我看你不是想学 regular expression 吧 你是想学 PCRE 这两个区别很大
    notgood
        23
    notgood  
       2019-03-21 19:35:34 +08:00
    @Sunyanzi 两位大佬, 为什么我的正则死活匹配不上, 调试也找不出问题, 求指点 谢谢
    log 如下 :

    Aug 15 08:59:07 <hostname> ss-server[1382]: 2018-08-15 08:59:07 ERROR: failed to handshake with <HOST>: authentication error

    正规表达式如下:
    failregex = ^\w+\s+\d+ \d+:\d+:\d+\s+%(__prefix_line)sERROR:\s+failed to handshake with <HOST>: authentication error$

    @mozillazg
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2753 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 12:02 · PVG 20:02 · LAX 04:02 · JFK 07:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.