`
simohayha
  • 浏览: 1395585 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

ruby way之正则表达式之二

    博客分类:
  • ruby
阅读更多
无语了,写好的blog,不小心按了刷新键,全没了........

7 使用字符类

字符类也就是包裹在中括号里面的一堆字符.他所匹配的是中括号里面的任意一个字符。

[aeiou] #匹配 a,e,i,o,u中的任意一个字符  
 
要注意在他里面的那些特殊字符比如.?之类的将全部只能表示他们字面上的意思,而\n之类的能正常转义
[a?si\n] #由于?在这里只能表示字面意思,所以这个匹配  a,?,s,i中的任意一个


^表示非
[^ae]  #匹配非a,e中的任意一个的字符


-表示区间
[a-z] #表示从a到z的任意一个字符


如果要在字符类中使用[ - ]那么就必学用\将他们转义

regess=/[a\-\[z]/
puts '-' =~ regess
puts '[' =~ regess


posix字符,比如[:digit:]表示数字,[:^digit:]表示 非数字

s1 = "abc\007def"
/[[:print:]]*/.match(s1)
puts  m1 = Regexp::last_match[0]             # "abc"

s2 = "abc123"
/[[:^digit:]]*/.match(s2)
puts  m1 = Regexp::last_match[0]             # "abc"


更简短的一些写法\d(匹配数字),\w(匹配组词字符),\s(匹配空格),小写的字母变成大写就是非.

9 扩展正则表达式

如果一个正则表达式太长,太复杂,我们想将它变成多行,并且加上注释,这时我们可以使用x修饰符,他会忽略 换行和空格,这样将使我们的表达式更可读:

regex = / ^                  # Beginning of string
          ((No\.?)\s+)?      # Optional: No[.]
          \d+ \s+            # Digits and spacing
          ((\w|[.'-])+       # Street name... may be
           \s*               #   multiple words.
          )+
          (,\s*              # Optional: Comma etc.
           (Apt\.?|Suite|\#) # Apt[.], Suite, #
           \s+               # Spacing
           (\d+|[A-Z])       # Numbers or single letter
          )?
          $                  # End of string
        /x


10 用点匹配换行

一般情况下我们的.智能匹配除了换行之外的所有字符,当我们加上m修饰符,他就能匹配多航了:

str1 = "Wolf 359"
str = "Rubies are red\nAnd violets are blue.\n"
pat1 = /red./
pat2 = /red./m
pat3 = /^And./m

puts  str =~ pat1       # nil
puts  str =~ pat2       # 11
puts  str =~ pat3       # 11


11 使用嵌套的修饰符

我们如果只想在一个正则表达式的一部分使用修饰符,我们可以使用(?option)和(?-option)来打开和关闭修饰符

reges=/abc(?i)def/       #匹配def时,打开大小写无关  
puts   "abcDEF" =~ reges    # 0
puts   "AbcDEF" =~ reges          #nil

reges=/ab(?i)cd(?-i)ef/    #匹配cd时,打开大小写无关
puts   "abCdef" =~ reges    #0
puts   "abCdEf" =~ reges     #nil
reges=/abc(?i-m).*/m    #匹配.*时打开大小写无关,关闭多行模式 


12使用嵌套的字表达式

我们使用?>来表示字表达式,这边注意的是,字表达式他是贪婪的,而且是不能回朔的。我们看下面的例子

str = "abccccdef"
re1 = /(abc*)cdef/
re2 = /(?>abc*)cdef/
puts   re1 =~ str            # 0
puts   re2 =~ str            # nil
puts   re1.match(str).to_a   # ["abccccdef", "abccc"]
puts   re2.match(str).to_a   # []


看最后一个匹配,re2由于是贪婪匹配,会先匹配到abcccc,这时他要匹配下一个cdef的时候,由于他不能回朔,因此匹配失败.

13 ruby 和Oniguruma
Oniguruma是ruby1.9的内置正则表达式引擎。

他和Japanized GNU regex 也就是ruby1.8内置的正则表达式引擎的区别可以看下面的:

引用
add character property (\p{property}, \P{property})
add hexadecimal digit char type (\h, \H)
add look-behind

(?<=fixed-char-length-pattern), (?<!fixed-char-length-pattern)
add possessive quantifier. ?+, *+, ++
add operations in character class. [], &&

(’[’ must be escaped as an usual char in character class.)
add named group and subexp call.
octal or hexadecimal number sequence can be treated as a multibyte code char in character class if multibyte encoding is specified.

(ex. [\xa1\xa2], [\xa1\xa7-\xa4\xa1])
allow the range of single byte char and multibyte char in character class.

ex. [a-<<any EUC-JP character>>] in EUC-JP encoding.
effect range of isolated option is to next ’)’. ex. (?:(?i)a|b) is interpreted as (?:(?i:a|b)), not (?:(?i:a)|b).
isolated option is not transparent to previous pattern. ex. a(?i)* is a syntax error pattern.
allowed incompleted left brace as an usual string. ex. /{/, /({)/, /a{2,3/ etc…
negative POSIX bracket [:^xxxx:] is supported.
POSIX bracket [:ascii:] is added.
repeat of look-ahead is not allowed. ex. (?=a)*, (?!b){5}
Ignore case option is effective to numbered character. ex. <code>/\x61/i =~ "A"<code>
In the range quantifier, the number of the minimum is omissible.

<code>/a{,n}/ == /a{0,n}/<code>

The simultanious abbreviation of the number of times of the minimum and the maximum is not allowed. (/a{,}/)
<code>a{n}?<code> is not a non-greedy operator. <code>/a{n}?/ == /(?:a{n})?/<code>
invalid back reference is checked and cause error. /\1/, /(a)\2/
Zero-length match in infinite repeat stops the repeat, then changes of the capture group status are checked as stop condition.
/(?:()|())*\1\2/ =~ ""
/(?:\1a|())*/ =~ "a"


更详细的信息,可以去他的官方网站看文档:

http://oniguruma.rubyforge.org/oniguruma/

如果你想要学习更多的正则表达式的知识,最好还是去看那本Mastering Regular Expressions..










分享到:
评论

相关推荐

    Addison Wesley The Ruby Way 2Nd Edition Oct 2006.pdf(英文版)

    2. **基础数据类型操作**:这部分内容涵盖了数字、字符串、正则表达式以及日期等低级数据类型的处理方法。 3. **正则表达式引擎(Oniguruma)**:介绍了一种新的正则表达式处理引擎,提高了处理效率和灵活性。 4. ...

    Addison.Wesley.The.Ruby.Way.2nd.Edition.Oct.2006.chm

    Ruby的标准库非常丰富,书中会介绍一些常用的库,如Net::HTTP用于网络请求,JSON和YAML用于数据序列化,Regexp用于正则表达式匹配,以及Open3和PTY用于进程管理和交互。这些库大大扩展了Ruby的功能,使其在各种场景...

    the ruby way

    它覆盖了Ruby的基础语法、类和对象、模块、集合、文件和I/O、网络编程、正则表达式、线程和并发、元编程等方面,以及如何利用Gem进行项目开发。无论是初学者还是有经验的开发者,都能从中受益,提升Ruby编程技能。

    关于ruby的几本电子书

    它深入探讨了Ruby语言的各种特性,包括基础语法、面向对象编程、模块和类、异常处理、文件系统操作、网络编程以及正则表达式等。书中的例子丰富,旨在帮助读者理解并掌握Ruby的精髓,从而能以"Ruby Way"的方式来思考...

    Ruby语言教程&案例&相关项目资源.docx

    - **字符串处理**:提供丰富的字符串处理功能,如字符串插值、多行字符串、正则表达式等。 - **异常处理**:支持异常处理机制,能够捕获并处理程序运行时出现的异常情况。 #### 应用领域 - **Web开发**:Ruby最...

    pythonchallenge level2官方方法集

    更简单的正则表达式,正则表达式是处理字符串的强大工具,这里强调了其在解决特定问题时的简化应用。 #### 42. PHP Solution PHP解决方案,展示了PHP语言在Web开发领域解决问题的能力和灵活性。 #### 43. Another...

Global site tag (gtag.js) - Google Analytics