重构 2 个正则表达式

Refactoring 2 Regexps

我要拆分字符串

smartcode = '{{question.answer}}'

终于得到刚刚

'answer'

我知道这行得通

smartcode.split(/\{{(.*?)\}}/).last.split(/\.(?=[\w])/).last

但我想这不是更好的方法...

我建议:

smartcode = '{{question.answer}}'
smartcode.match(/\.(\w+)/)[1]
#=> "answer"

或者当你想确保具体结构时用括号括起来,两个单词之间用点隔开:

smartcode.match(/{{\w+\.(\w+)}}/)[1]
#=> "answer"

如果你想让你的答案变得复杂,你不应该选择 \w+ 而应该选择 /.*\.(.*?)\}/ (基本上这会匹配 .}

例如:

> smartcode = '{{question.complex answer w/ more than 1 kind of symbols such as $}}'
> smartcode.match(/\.(\w+)/)[1]
=> "complex"
> smartcode.match(/.*\.(.*?)\}/)[1]
=> "complex answer w/ more than 1 kind of symbols such as $"

你可以使用

smartcode[/{{[^{}]*\.([^{}]*)}}/, 1]

/{{[^{}]*\.([^{}]*)}}/ 正则表达式(参见 regex demo)匹配

  • {{ - {{ 文本
  • [^{}]* - {} 以外的任何零个或多个字符尽可能多
  • \. - 一个点
  • ([^{}]*) - 第 1 组(此子字符串将与 [/regex/, num] 构造一起返回):除 {} 之外的任何零个或多个字符,尽可能多尽可能
  • }} - }} 文本。

参见 Ruby code online:

smartcode = '{{question.answer}}'
puts smartcode[/{{[^{}]*\.([^{}]*)}}/, 1]
# => answer

如果需要获取多个匹配项,请使用.scan:

smartcode = '{{question.answer}} and {{question.author}}'
puts smartcode.scan(/{{[^{}]*\.([^{}]*)}}/)
# => ['answer', 'author']

参见 this Ruby code demo