re = /[^\w](?<!->)(trans|trans_choice|Lang::get|Lang::choice|Lang::trans|Lang::transChoice|@lang|@choice|__)\s*\(\s*((?<![\\])['"])((?:.(?!(?<![\\])\2))*.?)\2\s*[,\)]/
str = 'Should match variations on method:
trans(\'a.b\');
trans_choice(\'a.b\')
Lang::get(\'a.b\');
Lang::choice(\'a.b\', 1);
Lang::trans(\'a.b\');
Lang::transChoice(\'a.b\', 2);
@lang(\'language.line\')
@choice(\'language.line\', 1);
__(\'a.b\')
Should match variations of contained string
trans(\'key\'); // No group, so JSON style
__(\'Json string\')
trans(\'a.b\');
trans(\'a.b.c\');
trans(\'a_b.c-d\');
trans(\'a.b!\');
trans(\'a.translate me!\');
trans(\'a.über~\');
trans("app.i\'m"); // contained quote of different type
trans(\'app."ok"\');
trans(\'with contained " quotes\');
trans(\'with an escaped \\\' quote\')
trans(\'with a double \\\\\')
Should match additional variables and whitespace
trans(\'a.b\', [1,2]);
trans (
\' with whitespace \' , $var)
Typical use cases
(trans ( \'lang.line\'));
<span>@lang(\'lang.line\')</span>
Should not match:
trans($var); // No quotes
trans(); // Nothing
anytrans(\'group.key\'); // not the method we need
1trans(\'lang.file\'); // not the method
_trans(\'lang.file\'); // not the method
->trans(\'lang.line\');
trans(\\\'why do we have an escaped quote here?\\\')
trans(\'with a triple \\\\\\\') <-- fail!
trans(\'lang.line\' . $middle); // concatenated vars
trans(\'lang.line\' . $middle . \'.ending\'); // concatenated vars
___(\'hello\') // not the method we need
'
# Print the match result
str.scan(re) do |match|
puts match.to_s
end
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Ruby, please visit: http://ruby-doc.org/core-2.2.0/Regexp.html