什么是Ruby正则表达式中的'?-mix'

Pla*_*fan 30 ruby regex

只是尝试在ruby中调试正则表达式.当我打印正则表达式的内容时,它显示?-mix在正则表达式的开头,即使这些字符不是表达式的一部分.请参阅以下IRB输出以查看此图示

irb(main):028:0* EXPR = /^a$/
=> /^a$/
irb(main):029:0> EXPR
=> /^a$/
irb(main):030:0> puts EXPR
(?-mix:^a$)
=> nil
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,当您使用puts打印出正则表达式的内容时,就会出现?-mix在开头.我应该担心吗?它来自哪里?

Yu *_*Hao 39

mix不是英文单词mix,它的选项Regexp.

Regexp#to_s:

返回包含正则表达式及其选项的字符串(使用(?opts:source)表示法.

在您的示例中,m用于多行模式,i用于不区分大小写,x用于扩展模式.破折号之前的选项打开,之后的选项关闭(默认).问题的例子,?-mix关闭所有选项.

你可以打开它们:

puts /^a$/mix
# =>(?mix:^a$)
Run Code Online (Sandbox Code Playgroud)


dim*_*mid 12

关于-它是标志的语法.在破折号之前的那些,以及之后的那些是关闭的.

正如Regexp文档中所述,这是一个内联修饰符,使用以下(?on-off)语法:

正则表达式的结束分隔符后面可以跟一个或多个单字母选项,后者控制模式的匹配方式.

  • /pat/i - 忽略大小写
  • /pat/m - 将换行视为匹配的字符 .
  • /pat/x - 忽略模式中的空格和注释
  • /pat/o- #{}仅执行一次插值

i,m,并且x也可以在与所述子表达式级别应用(?on-off)构建体,其使得选项,并禁用选项关闭用于由括号包围的表达.

因此,在我的情况,这意味着选项m,i以及x关断,没有上.