ケヴィンのなんかいろいろ

ハースストーンとかその他色々なことについて話すブログです

MENU

【C#】ツイートから良い感じにURLとハッシュタグを省く【正規表現】

今日の割とまともな知見です。良い感じにできた。

まとめ

Regex.Replaceを使う。using System.Text.RegularExpressions;してね。

//URL用
var urlPattern = "http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?";
//ハッシュタグ用
var hashPattern = "[\\s^][##]\\w+";

//組み合わせるだけ
var pattern = urlPattern + "|" + hashPattern;

var replaced = Regex.Replace(text, pattern, "").Trim();

経緯

kvin_aiで生成する文章にハッシュタグが混ざっちゃってた。URLの除去はできてたけど、ハッシュタグの除去はできてなかったのでがんばってやった。

kvin_aiについてはこちら。 kvinnoiroiro.hatenablog.com

この辺見ながらやろうとしたんですけど上手く行かなくて。

stackoverrun.com

qiita.com

このbotC#で作ってるからここ最近「C#」を連呼してるんですけど、ここのやり方だとそれが入ってると消えちゃうんですよね。

ということでどうすれば良いか考えて、Twitterの仕様的に文頭が行頭もしくは空白ならええんちゃうかと思って追加したらいい感じでした。

[\s^][##]\w+の詳細

URLの方はここからコピったからここ見てね。

正規表現による URLの検出

ハッシュタグの方の詳細を書きます。

var hashPattern = "[\\s^][##]\\w+";

見た目ヴェエエエエエエエエってなる(なった)んですけど、正規表現ってちゃんと意味があるんですよね。凄いなあって思った(こなみ)。

これを[\\s^][##]\\w+の3つに分けて解説します。

[\s^]

[]で括ることで、中に入ってる文字いずれかとの一致を取る様になります。中に入っているのは\\s^でまた変な感じですけど、これも\\s^に分解します。

\\sは、空白とかタブとか空白系の文字全てを示します。

^は、文章中での位置が行頭にあることを示しています。

ということで、[\\s^]は空白、もしくは行頭となります。

[##]

これも上と同様に[]で括られてるので、中の文字のいずれかとの一致するかを見ます。

中身は#と#。まあ半角のハッシュと全角のハッシュですね。これだけー。

\w+

これは括られていませんが、とりあえず\\w+に分解します。

\\wは、単語に使用される文字全てを表しています。アルファベット、数字、ひらがな、カタカナ、漢字、記号など、全ての文字を指定できます。たぶん。

+は、前の文字が1文字以上連続していることを表しています。今回前にある文字は\\wなので、全ての文字が対象になります。

ということで、\\w+は何かの文字が2文字以上あったら、ということになります。

そして正規表現には最長マッチと最短マッチというものがあり、基本は最長ですが判別したい対象の後ろに?を付けると最短になります。今回はどこにも付けてないので最長ですね。

〇文字以上を対象にするときはこの最長と最短が非常に大事になるんですけど、説明が難しいので自分で理解してください。

よっしゃ合体だ!!!!!キラキラバシューン!!!!!

IQサプリの漢字パズルを思い出した。

[\\s^][##]\\w+ = 1文字目が空白or行頭!2文字目が全/半角ハッシュ!3文字目以降が何かの文字でそれが連続してるぞ!

よしできた!完璧だな!残念ながら完璧ではない。ハッシュタグは文中文末文頭あらゆるところに入るので場所によっては末尾に変な空白が残る時がある。たぶん。

というわけで最後に.Trim()で文頭文末の空白を削除して勝利だ!やったな!

その他詳しい正規表現の話はこっち見てね。

正規表現の基本 - .NET Tips (VB.NET,C#...)

じゃあな!