0

どうすればこれを改善できますか?

このコードの目的は、フォームから 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"
]

前もって感謝します。

4

2 に答える 2

2

正規表現を展開しましょう:

(
   [a-zA-Z0-9]+ (-|_)? \w+
   | #? [a-zA-Z0-9]+ (-|_)? \w+
)

(キャプチャーグループ開始

[a-zA-Z0-9]+1 つ以上の英数字に一致

(-|_)?ハイフンまたはアンダースコアに一致させて保存します。このグループは失敗する可能性があります

\w+1 つ以上の「単語」文字 (英数字 + アンダースコア) に一致

|またはこれに一致:

#?オプションの#文字に一致

[a-zA-Z0-9]+1 つ以上の英数字に一致

(-|_)?ハイフンまたはアンダースコアと一致してキャプチャします。失敗する可能性があります。

\w+1 つ以上の単語文字に一致

)エンドキャプチャ

この正規表現は次のように書きたいと思います。

(#? [a-zA-Z0-9]+ (-|_)? \w+)

また

( #? [a-zA-Z0-9]+ (-?\w+)? )

また

( #? [a-zA-Z0-9]+ -? \w+ )

(すべてが合理的に同等です)

この正規表現は、たとえば Unicode 文字を含むハッシュタグでは失敗することに注意してください#Ü-Umlaut, #façade。また、最小長は 2 文字 (#a失敗、#ab一致) に制限されており、ハイフンは 1 つしかない場合があります (#a-b-c失敗 / が返される#a-b) 。

于 2012-07-31T19:23:35.827 に答える
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
于 2012-07-31T19:49:51.257 に答える