web-dev-qa-db-ja.com

セルからソーシャルハッシュタグを抽出するにはどうすればよいですか?

例:

A2 -> What a beautiful day! #sunday #summer
B3 -> #news Stay tuned for our next contest! #something

Desired output on B2 ->#sunday #summer
Desired output on B3 ->#news #something

私が見つけた最も近いものはREGEXEXTRACTですが、#で始まる最初のWordのみを配信します。

=REGEXEXTRACT(A2;"#[A-z0-9]+")
3
Renan

regexextract配列を返すことができます ですが、いくつあるかを知る必要があるため、これは役に立ちません。 regexextractのこの制限を回避する方法は、regexreplaceを使用して、do n'tが欲しいテキストを取り除くことです。 。このような:

=trim(regexreplace(A2, "(^|\s)[^#]\S*", ""))

正規表現は、#で始まらない単語に一致し、空の文字列に置き換えます。トリム機能は、残っている可能性のある余分なスペースをクリーンアップします。

より良いトリミング

上記の例では問題なく動作しますが、より複雑な状況ではいくつかの欠陥があります。

Breaking #news-in just now! A new photo #contest! Code name #as_shot (important underscore here). #something. 

上記のコマンドは戻ります

#news-in #contest! #as_shot #something. 

ハッシュタグに-!.を含めることができないことを認識していません(「Word文字」、A-Za-z0-9_に制限されています)。そのため、クリーンアップするには別の正規表現が必要です。両方を1つのコマンドに入れます。このようなregexreplaceのネストは非常に一般的です。

=regexreplace(trim(regexreplace(A2, "(^|\s)[^#]\S*","")), "[^#\w\s]\S*", "") 

外部置換は、\wでも#でもない最初の文字からハッシュタグの部分を削除します。出力には正しいハッシュタグがあります:

#news #contest #as_shot #something

単純化

上記の両方の正規表現を代替として与えることで、両方のregexreplaceコマンドを1つにまとめることができるようです。この組み合わされた正規表現のロジックは従うのが難しいですが、私が試したすべての例で機能しました。

=trim(regexreplace(A2, "((^|\s)[^#]\S*)|([^#\w\s]\S*)", ""))
6
user79865

もう1つの方法は、次のように分割、結合、繰り返しを正規表現抽出と組み合わせることです。

=join(" ",REGEXEXTRACT(A1,rept(".*(#\w+\S?\w+)",counta(split(A1,"#"))-1)))

基本的には、テキストを#で分割し、その回数をキャプチャするために汎用正規表現を繰り返します(splitを使用するときに追加するセルに対して-1)-また、時々追加の文字を含めることができます-または_などの\ S?

enter image description here

1