此代码的目的是在一个方法中使用,该方法从表单中捕获一串hash_tags #twittertype - 通过单词列表进行解析并确保所有单词都被分离出来。
WORD_TEST = "123 sunset #2d2-apple,#home,#star #Babyclub, #apple_surprise #apple,cats mustard#dog , #basic_cable safety #222 #dog-D#DOG#2D "
SECOND_TEST = 'orion#Orion#oRion,Mike'
这是我的问题区域RegXps ...
_string_rgx = /([a-zA-Z0-9]+(-|_)?\w+|#?[a-zA-Z0-9]+(-|_)?\w+)/
add_pound_sign = lambda { |a| a[0].chr == '#' ? a : a='#' + a; a}
我不知道那么多正则表达式:因此需要收集扫描结果中的第一个[元素] - >它产生了奇怪的东西,但第一个元素总是我想要的。
t_word = WORD_TEST.scan(_string_rgx).collect {|i| i[0] }
s_word = SECOND_TEST.scan(_string_rgx).collect {|i| i[0] }
t_word.map! { |a| a = add_pound_sign.call(a); a }
s_word.map! { |a| a = add_pound_sign.call(a); a }
结果是我想要的。我只想要Ruby的见解正则表达式大师在那里。
puts t_word.inspect
[
"#123", "#sunset", "#2d2-apple", "#home", "#star", "#Babyclub",
"#apple_surprise", "#apple", "#cats", "#mustard", "#dog",
"#basic_cable", "#safety", "#222", "#dog-D", "#DOG", "#2D"
]
puts s_word.inspect
[
"#orion", "#Orion", "#oRion", "#Mike"
]
提前致谢。
答案 0 :(得分:2)
让我们展开正则表达式:
(
[a-zA-Z0-9]+ (-|_)? \w+
| #? [a-zA-Z0-9]+ (-|_)? \w+
)
(
开始捕获组
[a-zA-Z0-9]+
匹配一个或多个字母数字字符
(-|_)?
匹配连字符或下划线并保存。该组可能会失败
\w+
匹配一个或多个“字”字符(字母数字+下划线)
|
或者匹配这个:
#?
匹配可选的#
字符
[a-zA-Z0-9]+
匹配一个或多个字母数字字符
(-|_)?
匹配连字符或下划线并捕获。可能会失败。
\w+
匹配一个或多个单词字符
)
结束字幕
我宁愿像这样写这个正则表达式;
(#? [a-zA-Z0-9]+ (-|_)? \w+)
或
( #? [a-zA-Z0-9]+ (-?\w+)? )
或
( #? [a-zA-Z0-9]+ -? \w+ )
(一切都相当合理)
你应该注意,这个正则表达式将在带有unicode字符的主题标签上失败,例如#Ü-Umlaut, #façade
等。您也被限制为两个字符的最小长度(#a
失败,#ab
匹配)并且可能只有一个连字符(#a-b-c
失败/将返回#a-b
)
答案 1 :(得分:0)
我会减少你的正则表达式模式:
WORD_TEST = "123 sunset #2d2-apple,#home,#star #Babyclub, #apple_surprise #apple,cats mustard#dog , #basic_cable safety #222 #dog-D#DOG#2D "
foo = []
WORD_TEST.scan(/#?[-\w]+\b/) do |s|
foo.push( s[0] != '#' ? '#' + s : s )
end