我正试图从字符串中提取特定模式的所有唯一匹配项我的绳子是text = 'My name is {{user_name}} {{user_second name}}. I am {{anything_else}}'
我想提取双括号中以“user”开头的文本对于给定的字符串,我希望有以下数组["user_name", "user_second name"]
。
我试图使用下面的正则表达式来实现这一点,但是如果方括号中有空格,它会以某种方式忽略它。text.scan(/\{{(customer_\w*)\}}/).uniq.flatten
返回["user_name"]
任何帮助都将不胜感激。
最佳答案
\w*
只匹配0个或多个字字符,不匹配空白。
对于这种情况,最好的模式似乎是惰性点模式:
/{{(user_.*?)}}/
^^^
请参见Rubular demo和online Ruby demo。
这里的
.*?
将匹配除换行符以外的任何0+字符,尽可能少,直到第一个}}
。如果用户名不能有
}
,也可以使用/{{(user_[^}]*)}}/
regex。除[^}]*
字符外,}
负数字符类匹配0个或多个字符与基于.*?
的解决方案还有一个区别:[^}]
还匹配换行符若要使.
匹配换行符,请在第一个正则表达式/m
中添加一个/{{(user_.*?)}}/m
修饰符。