快速入门
教程
工具和语言
示例
参考
书籍评论
正则表达式工具
grep
PowerGREP
RegexBuddy
RegexMagic
通用应用程序
EditPad Lite
EditPad Pro
语言和库
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQuery 和 XPath
XRegExp
数据库
MySQL
Oracle
PostgreSQL
本网站上的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书籍评论
可打印 PDF
关于本网站
RSS Feed 和博客
RegexBuddy—The best regex editor and tester for Ruby developers!

使用 Ruby 的正则表达式

Ruby 支持正则表达式作为语言特性。在 Ruby 中,正则表达式以 /pattern/modifiers 的形式编写,其中“pattern”是正则表达式本身,“modifiers”是一系列表示各种选项的字符。“modifiers”部分是可选的。此语法借鉴自 Perl。Ruby 支持以下 修饰符

您可以通过将多个修饰符串在一起(如 /regex/is)来组合多个修饰符。

在 Ruby 中,脱字符和美元符号始终在换行符之前和之后匹配。Ruby 没有修改器来更改此设置。使用 \A\Z字符串的开头或结尾处进行匹配

由于正斜杠分隔正则表达式,因此正则表达式中出现的任何正斜杠都需要转义。例如,正则表达式 1/2 在 Ruby 中写为 /1\/2/

如何使用 Regexp 对象

/regex/ 创建类 Regexp 的新对象。你可以将其分配给变量以重复使用相同的正则表达式,或直接使用文字正则表达式。Ruby 提供了几种不同的方法来测试特定正则表达式是否匹配(部分)字符串。

=== 方法允许你将正则表达式与字符串进行比较。如果正则表达式匹配(部分)字符串,则返回 true,否则返回 false。这允许在 case 语句中使用正则表达式。不要将 ===(3 个等号)与 ==(2 个等号)混淆。== 允许你将一个正则表达式与另一个正则表达式进行比较,以查看这两个正则表达式是否相同并使用相同的匹配模式。

=~ 方法返回匹配开始处的字符串中的字符位置,如果没有找到匹配项,则返回 nil。在布尔测试中,字符位置评估为 true,nil 评估为 false。因此,你可以使用 =~ 代替 === 使你的代码更易于阅读,因为 =~ 显然是一个正则表达式匹配运算符。Ruby 从 Perl 借用了 =~ 语法。print(/\w+/ =~ "test") 打印“0”。字符串中的第一个字符的索引为零。切换 =~ 运算符的操作数的顺序没有区别。

match() 方法在找到匹配项时返回 MatchData 对象,如果未找到匹配项,则返回 nil。在布尔上下文中,MatchData 对象评估为 true。在字符串上下文中,MatchData 对象评估为匹配的文本。因此,print(/\w+/.match("test")) 打印“test”。

Ruby 2.4 添加了 match?() 方法。它像 === 方法一样返回 true 或 false。不同之处在于 match?() 不设置 $~(见下文),因此不需要创建 MatchData 对象。如果你不需要任何匹配详细信息,则应使用 match?() 来提高性能。

特殊变量

方法 ====~match() 创建一个 MatchData 对象,并将其分配给特殊变量 $~Regexp.match() 也返回此对象。变量 $~ 是线程局部且方法局部的。这意味着在方法退出之前或在方法中下一次使用 =~ 运算符之前,您都可以使用此变量,而不用担心其他线程或线程中的其他方法会覆盖它们。

许多其他特殊变量都派生自 $~ 变量。所有这些都是只读的。如果您将新的 MatchData 实例分配给 $~,则所有这些变量也会更改。 $& 保存与整个正则表达式匹配的文本。 $1$2 等保存与第一个、第二个和后续捕获组匹配的文本。 $+ 保存与实际参与匹配的编号最高的捕获组匹配的文本。 $`$' 保存正则表达式匹配的左右两侧的主题字符串中的文本。

搜索和替换

使用 String 类的 sub()gsub() 方法分别搜索并替换字符串中的第一个正则表达式匹配或所有正则表达式匹配。将您要搜索的正则表达式指定为第一个参数,将替换字符串指定为第二个参数,例如: result = subject.gsub(/before/, "after")

要重新插入正则表达式匹配,请在替换字符串中使用 \0。您可以在替换字符串中使用 捕获组 的内容,并使用反向引用 \1\2\3 等。请注意,在双引号字符串中,用反斜杠转义的数字将被视为八进制转义。八进制转义在语言级别处理,在 sub() 函数看到参数之前。为防止这种情况,您需要在双引号字符串中转义反斜杠。因此,要使用第一个反向引用作为替换字符串,请传递 '\1'"\\1"'\\1' 也适用。

拆分字符串和收集匹配

要将字符串中的所有正则表达式匹配收集到一个数组中,请将正则表达式对象传递给字符串的 scan() 方法,例如: myarray = mystring.scan(/regex/)。有时,创建正则表达式来匹配分隔符而不是您感兴趣的文本会更容易。在这种情况下,请改用 split() 方法,例如: myarray = mystring.split(/delimiter/)split() 方法会丢弃所有正则表达式匹配,并返回匹配之间的文本。 scan() 方法则相反。

如果您的正则表达式包含 捕获组,则 scan() 将返回一个数组的数组。总体数组中的每个元素都将包含一个数组,其中包含总体正则表达式匹配以及与所有捕获组匹配的文本。

| 快速入门 | 教程 | 工具和语言 | 示例 | 参考 | 书籍评论 |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML Schema | Xojo | XQuery 和 XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |