ทับทิมนิพจน์ปกติ
การแสดงออกปกติเป็นลำดับตัวอักษรพิเศษซึ่งผ่านการใช้รูปแบบไวยากรณ์พิเศษเพื่อให้ตรงกับหรือหาคอลเลกชันของสตริง
การแสดงออกปกติจะใช้จำนวนของชุดที่กำหนดไว้ล่วงหน้าของตัวละครบางและตัวละครเหล่านี้โดยเฉพาะในรูปแบบ "กฎสตริง" ที่ "สตริงกฎ" ถูกนำมาใช้ในการแสดงตรรกะสตริงกรอง
ไวยากรณ์
การแสดงออกปกติอย่างแท้จริงคือการเฉือนหรือบางแห่งในระหว่างหลังจากโหมด% R กับตัวคั่นระหว่างดังนี้
/pattern/ /pattern/im # 可以指定选项 %r!/usr/local! # 使用分隔符的正则表达式
ตัวอย่าง
#!/usr/bin/ruby line1 = "Cats are smarter than dogs"; line2 = "Dogs also like meat"; if ( line1 =~ /Cats(.*)/ ) puts "Line1 contains Cats" end if ( line2 =~ /Cats(.*)/ ) puts "Line2 contains Dogs" end
เรียกเอาท์พุทตัวอย่างข้างต้นคือ
Line1 contains Cats
การปรับเปลี่ยนการแสดงผลปกติ
การแสดงออกปกติแท้จริงอาจมีตัวเลือกสำหรับการปรับปรุงการควบคุมด้านต่างๆของการแข่งขัน ปรับปรุงหลังจากที่สองการกำหนดตัวอักษรเฉือนดังแสดงในตัวอย่างข้างต้น ดัชนีแสดงการปรับเปลี่ยนเป็นไปได้:
การปรับเปลี่ยน | ลักษณะ |
---|---|
ผม | ไม่สนใจกรณีที่ตรงกับข้อความ |
โอ | ดำเนินการเพียงครั้งเดียว # {} แก้ไขการแสดงออกปกติเป็นครั้งแรกเมื่อเขาเป็นผู้ตัดสิน |
x | ละเว้นช่องว่างที่ได้รับอนุญาตในช่องว่างและความคิดเห็นในการแสดงออกทั้งหมด |
ม. | จับคู่หลายบรรทัด, อักขระขึ้นบรรทัดใหม่ได้รับการยอมรับเป็นตัวอักษรปกติ |
U, E, S, N | การแสดงออกปกติถูกตีความว่าเป็น Unicode (UTF-8), EUC, SJIS หรือ ASCII หากไม่มีการปรับปรุงถือว่าเป็นนิพจน์ปกติโดยใช้รหัสที่มา |
เช่นเดียวกับสายแยกจากกันโดย Q% เช่นเดียวกับทับทิมช่วยให้คุณสามารถ% R เป็นจุดเริ่มต้นของการแสดงออกปกติตามด้วยตัวคั่นโดยพลการ คำอธิบายนี้มีจำนวนมากที่มีประโยชน์มากเมื่อคุณไม่ต้องการที่จะหลบหนีตัวอักษรเฉือน
# 下面匹配单个斜杠字符,不转义 %r|/| # Flag 字符可通过下面的语法进行匹配 %r[</(.*)>]i
รูปแบบการแสดงออกปกติ
นอกเหนือไปจากการควบคุมตัวอักษรที่ (+ * ^ $ () [] {} | ?. \) ตัวละครอื่น ๆ ทั้งหมดตรงกับตัวเองคุณสามารถควบคุมตัวละครก่อนที่จะวางเครื่องหมายที่จะหลบหนีการควบคุมตัวอักษร
ตารางต่อไปนี้แสดงนิพจน์ปกติไวยากรณ์ทับทิมใช้ได้
模式 | 描述 |
---|---|
^ | 匹配行的开头。 |
$ | 匹配行的结尾。 |
. | 匹配除了换行符以外的任意单字符。使用 m 选项时,它也可以匹配换行符。 |
[...] | 匹配在方括号中的任意单字符。 |
[^...] | 匹配不在方括号中的任意单字符。 |
re* | 匹配前面的子表达式零次或多次。 |
re+ | 匹配前面的子表达式一次或多次。 |
re? | 匹配前面的子表达式零次或一次。 |
re{ n} | 匹配前面的子表达式 n 次。 |
re{ n,} | 匹配前面的子表达式 n 次或 n 次以上。 |
re{ n, m} | 匹配前面的子表达式至少 n 次至多 m 次。 |
a| b | 匹配 a 或 b。 |
(re) | 对正则表达式进行分组,并记住匹配文本。 |
(?imx) | 暂时打开正则表达式内的 i、 m 或 x 选项。如果在圆括号中,则只影响圆括号内的部分。 |
(?-imx) | 暂时关闭正则表达式内的 i、 m 或 x 选项。如果在圆括号中,则只影响圆括号内的部分。 |
(?: re) | 对正则表达式进行分组,但不记住匹配文本。 |
(?imx: re) | 暂时打开圆括号内的 i、 m 或 x 选项。 |
(?-imx: re) | 暂时关闭圆括号内的 i、 m 或 x 选项。 |
(?#...) | 注释。 |
(?= re) | 使用模式指定位置。没有范围。 |
(?! re) | 使用模式的否定指定位置。没有范围。 |
(?> re) | 匹配无回溯的独立模式。 |
\w | 匹配单词字符。 |
\W | 匹配非单词字符。 |
\s | 匹配空白字符。等价于 [\t\n\r\f]。 |
\S | 匹配非空白字符。 |
\d | 匹配数字。等价于 [0-9]。 |
\D | 匹配非数字。 |
\A | 匹配字符串的开头。 |
\Z | 匹配字符串的结尾。如果存在换行符,则只匹配到换行符之前。 |
\z | 匹配字符串的结尾。 |
\G | 匹配最后一个匹配完成的点。 |
\b | 当在括号外时匹配单词边界,当在括号内时匹配退格键(0x08)。 |
\B | 匹配非单词边界。 |
\n, \t, etc. | 匹配换行符、回车符、制表符,等等。 |
\1...\9 | 匹配第 n 个分组子表达式。 |
\10 | 如果已匹配过,则匹配第 n 个分组子表达式。否则指向字符编码的八进制表示。 |
ตัวอย่างของการแสดงออกปกติ
ตัวละคร
ตัวอย่าง | ลักษณะ |
---|---|
/ ทับทิม / | การแข่งขัน "ทับทิม" |
¥ | เยนจับคู่สัญลักษณ์ ทับทิมทับทิม 1.9 และ 1.8 สนับสนุนอักขระหลาย |
ชั้นเรียนตัวอักษร
实例 | 描述 |
---|---|
/[Rr]uby/ | 匹配 "Ruby" 或 "ruby" |
/rub[ye]/ | 匹配 "ruby" 或 "rube" |
/[aeiou]/ | 匹配任何一个小写元音字母 |
/[0-9]/ | 匹配任何一个数字,与 /[0123456789]/ 相同 |
/[a-z]/ | 匹配任何一个小写 ASCII 字母 |
/[A-Z]/ | 匹配任何一个大写 ASCII 字母 |
/[a-zA-Z0-9]/ | 匹配任何一个括号内的字符 |
/[^aeiou]/ | 匹配任何一个非小写元音字母的字符 |
/[^0-9]/ | 匹配任何一个非数字字符 |
ชั้นเรียนตัวอักษรพิเศษ
实例 | 描述 |
---|---|
/./ | 匹配除了换行符以外的其他任意字符 |
/./m | 在多行模式下,也能匹配换行符 |
/\d/ | 匹配一个数字,等同于 /[0-9]/ |
/\D/ | 匹配一个非数字,等同于 /[^0-9]/ |
/\s/ | 匹配一个空白字符,等同于 /[ \t\r\n\f]/ |
/\S/ | 匹配一个非空白字符,等同于 /[^ \t\r\n\f]/ |
/\w/ | 匹配一个单词字符,等同于 /[A-Za-z0-9_]/ |
/\W/ | 匹配一个非单词字符,等同于 /[^A-Za-z0-9_]/ |
ทำซ้ำ
实例 | 描述 |
---|---|
/ruby?/ | 匹配 "rub" 或 "ruby"。其中,y 是可有可无的。 |
/ruby*/ | 匹配 "rub" 加上 0 个或多个的 y。 |
/ruby+/ | 匹配 "rub" 加上 1 个或多个的 y。 |
/\d{3}/ | 刚好匹配 3 个数字。 |
/\d{3,}/ | 匹配 3 个或多个数字。 |
/\d{3,5}/ | 匹配 3 个、4 个或 5 个数字。 |
ซ้ำไม่โลภ
นี้จะตรงกับจำนวนขั้นต่ำของการทำซ้ำ
实例 | 描述 |
---|---|
/<.*>/ | 贪婪重复:匹配 "<ruby>perl>" |
/<.*?>/ | 非贪婪重复:匹配 "<ruby>perl>" 中的 "<ruby>" |
จัดกลุ่มตามวงเล็บ
实例 | 描述 |
---|---|
/\D\d+/ | 无分组: + 重复 \d |
/(\D\d)+/ | 分组: + 重复 \D\d 对 |
/([Rr]uby(, )?)+/ | 匹配 "Ruby"、"Ruby, ruby, ruby",等等 |
Backreferences
การแข่งขันก่อนการแข่งขันนี้ได้จัดกลุ่มอีกครั้ง
实例 | 描述 |
---|---|
/([Rr])uby&\1ails/ | 匹配 ruby&rails 或 Ruby&Rails |
/(['"])(?:(?!\1).)*\1/ | 单引号或双引号字符串。\1 匹配第一个分组所匹配的字符,\2 匹配第二个分组所匹配的字符,依此类推。 |
แทนที่
实例 | 描述 |
---|---|
/ruby|rube/ | 匹配 "ruby" 或 "rube" |
/rub(y|le))/ | 匹配 "ruby" 或 "ruble" |
/ruby(!+|\?)/ | "ruby" 后跟一个或多个 ! 或者跟一个 ? |
สมอ
นี้ต้องตรงกับสถานที่ที่กำหนด
实例 | 描述 |
---|---|
/^Ruby/ | 匹配以 "Ruby" 开头的字符串或行 |
/Ruby$/ | 匹配以 "Ruby" 结尾的字符串或行 |
/\ARuby/ | 匹配以 "Ruby" 开头的字符串 |
/Ruby\Z/ | 匹配以 "Ruby" 结尾的字符串 |
/\bRuby\b/ | 匹配单词边界的 "Ruby" |
/\brub\B/ | \B 是非单词边界:匹配 "rube" 和 "ruby" 中的 "rub",但不匹配单独的 "rub" |
/Ruby(?=!)/ | 如果 "Ruby" 后跟着一个感叹号,则匹配 "Ruby" |
/Ruby(?!!)/ | 如果 "Ruby" 后没有跟着一个感叹号,则匹配 "Ruby" |
วงเล็บไวยากรณ์พิเศษ
实例 | 描述 |
---|---|
/R(?#comment)/ | 匹配 "R"。所有剩余的字符都是注释。 |
/R(?i)uby/ | 当匹配 "uby" 时不区分大小写。 |
/R(?i:uby)/ | 与上面相同。 |
/rub(?:y|le))/ | 只分组,不进行 \1 反向引用 |
ค้นหาและแทนที่
ย่อยและตัวแปรเปลี่ยนตัว gsubย่อยของพวกเขาและgsub!เป็นสิ่งสำคัญเมื่อใช้วิธีการสตริงนิพจน์ปกติ
ทุกวิธีการเหล่านี้จะใช้รูปแบบการแสดงผลปกติเพื่อดำเนินการค้นหาและแทนที่การดำเนินงานย่อยและ sub!รูปแบบการเปลี่ยนครั้งแรกของการเกิดขึ้น, gsub และgsub!แทนที่เกิดขึ้นทุกรูปแบบ
ย่อยและ gsubกลับสตริงใหม่ออกจากสายเดิมไม่ได้แก้ไขและย่อย! และgsub!ปรับเปลี่ยนสายที่พวกเขาจะเรียก
นี่คือตัวอย่าง:
#!/usr/bin/ruby # -*- coding: UTF-8 -*- phone = "138-3453-1111 #这是一个电话号码" # 删除 Ruby 的注释 phone = phone.sub!(/#.*$/, "") puts "电话号码 : #{phone}" # 移除数字以外的其他字符 phone = phone.gsub!(/\D/, "") puts "电话号码 : #{phone}"
เรียกเอาท์พุทตัวอย่างข้างต้นคือ
电话号码 : 138-3453-1111 电话号码 : 13834531111
นี่เป็นอีกตัวอย่างหนึ่ง:
#!/usr/bin/ruby # -*- coding: UTF-8 -*- text = "rails 是 rails, Ruby on Rails 非常好的 Ruby 框架" # 把所有的 "rails" 改为 "Rails" text.gsub!("rails", "Rails") # 把所有的单词 "Rails" 都改成首字母大写 text.gsub!(/\brails\b/, "Rails") puts "#{text}"
เรียกเอาท์พุทตัวอย่างข้างต้นคือ
Rails 是 Rails, Ruby on Rails 非常好的 Ruby 框架