using System;
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
var HASHTAG_LETTERS = @"\p{L}\p{M}";
var HASHTAG_NUMERALS = @"\p{Nd}";
var HASHTAG_SPECIAL_CHARS = @"_\u200c\u200d\ua67e\u05be\u05f3\u05f4\uff5e\u301c\u309b\u309c\u30a0\u30fb\u3003\u0f0b\u0f0c\u00b7";
var HASHTAG_LETTERS_NUMERALS = HASHTAG_LETTERS + HASHTAG_NUMERALS + HASHTAG_SPECIAL_CHARS;
var HASHTAG_LETTERS_NUMERALS_SET = "[" + HASHTAG_LETTERS_NUMERALS + "]";
var HASHTAG_LETTERS_SET = "[" + HASHTAG_LETTERS + "]";
var VALID_HASHTAG = new Regex("(^|[^&" + HASHTAG_LETTERS_NUMERALS + @"])(#|\uFF03)(?!\uFE0F|\u20E3)(" + HASHTAG_LETTERS_NUMERALS_SET + "*" + HASHTAG_LETTERS_SET + HASHTAG_LETTERS_NUMERALS_SET + "*)", RegexOptions.IgnoreCase);
var tests = new List<string>() {"#hashtag",
"#Azərbaycanca",
"#mûǁae",
"#Čeština",
"#Ċaoiṁín",
"#Caoiṁín",
"#táim",
"#hag̃ua",
"#café",
"#עברית",
"#אֲשֶׁר",
"#עַל־יְדֵי",
"#וכו׳",
"#מ״כ",
"#العربية",
"#حالياً",
"#يـﮱـَٱ",
"#ประเทศไทย",
"#ฟรี",
"#日本語ハッシュタグ",
"#日本語ハッシュタグ",
"これはOK #ハッシュタグ",
"これもOK。#ハッシュタグ",
"これはダメ#ハッシュタグ",
"#1",
"#2"};
tests.ForEach(input =>
Console.WriteLine("Input: " + input + " = " + VALID_HASHTAG.IsMatch(input) +
(VALID_HASHTAG.IsMatch(input) ? ", match = " + VALID_HASHTAG.Match(input).Value : "")));
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CnVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKcHVibGljIGNsYXNzIFRlc3QKewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJCXZhciBIQVNIVEFHX0xFVFRFUlMgPSBAIlxwe0x9XHB7TX0iOwoJICAgIHZhciBIQVNIVEFHX05VTUVSQUxTID0gQCJccHtOZH0iOwoJICAgIHZhciBIQVNIVEFHX1NQRUNJQUxfQ0hBUlMgPSBAIl9cdTIwMGNcdTIwMGRcdWE2N2VcdTA1YmVcdTA1ZjNcdTA1ZjRcdWZmNWVcdTMwMWNcdTMwOWJcdTMwOWNcdTMwYTBcdTMwZmJcdTMwMDNcdTBmMGJcdTBmMGNcdTAwYjciOwoJICAgIHZhciBIQVNIVEFHX0xFVFRFUlNfTlVNRVJBTFMgPSBIQVNIVEFHX0xFVFRFUlMgKyBIQVNIVEFHX05VTUVSQUxTICsgSEFTSFRBR19TUEVDSUFMX0NIQVJTOwoJICAgIHZhciBIQVNIVEFHX0xFVFRFUlNfTlVNRVJBTFNfU0VUID0gIlsiICsgSEFTSFRBR19MRVRURVJTX05VTUVSQUxTICsgIl0iOwoJICAgIHZhciBIQVNIVEFHX0xFVFRFUlNfU0VUID0gIlsiICsgSEFTSFRBR19MRVRURVJTICsgIl0iOwoJICAgIHZhciBWQUxJRF9IQVNIVEFHID0gbmV3IFJlZ2V4KCIoXnxbXiYiICsgSEFTSFRBR19MRVRURVJTX05VTUVSQUxTICsgQCJdKSgjfFx1RkYwMykoPyFcdUZFMEZ8XHUyMEUzKSgiICsgSEFTSFRBR19MRVRURVJTX05VTUVSQUxTX1NFVCArICIqIiArIEhBU0hUQUdfTEVUVEVSU19TRVQgKyBIQVNIVEFHX0xFVFRFUlNfTlVNRVJBTFNfU0VUICsgIiopIiwgUmVnZXhPcHRpb25zLklnbm9yZUNhc2UpOwoJICAgIAoJICAgIHZhciB0ZXN0cyA9IG5ldyBMaXN0PHN0cmluZz4oKSB7IiNoYXNodGFnIiwKCQkJIiNBesmZcmJheWNhbmNhIiwKCQkJIiNtw7vHgWFlIiwKCQkJIiPEjGXFoXRpbmEiLAoJCQkiI8SKYW9p4bmBw61uIiwKCQkJIiNDYW9p4bmBw61uIiwKCQkJIiN0YcyBaW0iLAoJCQkiI2hhZ8yDdWEiLAoJCQkiI2NhZsOpIiwKCQkJIiPXoteR16jXmdeqIiwKCQkJIiPXkNay16nWtteB16giLAoJCQkiI9ei1rfXnNa+15nWsNeT1rXXmSIsCgkJCSIj15XXm9eV17MiLAoJCQkiI9ee17TXmyIsCgkJCSIj2KfZhNi52LHYqNmK2KkiLAoJCQkiI9it2KfZhNmK2KfZiyIsCgkJCSIj2YrZgO+usdmA2Y7ZsSIsCgkJCSIj4Lib4Lij4Liw4LmA4LiX4Lio4LmE4LiX4LiiIiwKCQkJIiPguJ/guKPguLUiLAoJCQkiI+aXpeacrOiqnuODj+ODg+OCt+ODpeOCv+OCsCIsCgkJCSLvvIPml6XmnKzoqp7jg4/jg4Pjgrfjg6Xjgr/jgrAiLAoJCQki44GT44KM44GvT0sgI+ODj+ODg+OCt+ODpeOCv+OCsCIsCgkJCSLjgZPjgozjgoJPS+OAgiPjg4/jg4Pjgrfjg6Xjgr/jgrAiLAoJCQki44GT44KM44Gv44OA44OhI+ODj+ODg+OCt+ODpeOCv+OCsCIsCgkJCSIjMSIsCgkJCSIjMiJ9OwoJCXRlc3RzLkZvckVhY2goaW5wdXQgPT4KCQkJQ29uc29sZS5Xcml0ZUxpbmUoIklucHV0OiAiICsgaW5wdXQgKyAiID0gIiArIFZBTElEX0hBU0hUQUcuSXNNYXRjaChpbnB1dCkgKwoJCQkgIChWQUxJRF9IQVNIVEFHLklzTWF0Y2goaW5wdXQpID8gIiwgbWF0Y2ggPSAiICsgVkFMSURfSEFTSFRBRy5NYXRjaChpbnB1dCkuVmFsdWUgOiAiIikpKTsKCX0KfQ==
Input: #hashtag = True, match = #hashtag
Input: #Azərbaycanca = True, match = #Azərbaycanca
Input: #mûǁae = True, match = #mûǁae
Input: #Čeština = True, match = #Čeština
Input: #Ċaoiṁín = True, match = #Ċaoiṁín
Input: #Caoiṁín = True, match = #Caoiṁín
Input: #táim = True, match = #táim
Input: #hag̃ua = True, match = #hag̃ua
Input: #café = True, match = #café
Input: #עברית = True, match = #עברית
Input: #אֲשֶׁר = True, match = #אֲשֶׁר
Input: #עַל־יְדֵי = True, match = #עַל־יְדֵי
Input: #וכו׳ = True, match = #וכו׳
Input: #מ״כ = True, match = #מ״כ
Input: #العربية = True, match = #العربية
Input: #حالياً = True, match = #حالياً
Input: #يـﮱـَٱ = True, match = #يـﮱـَٱ
Input: #ประเทศไทย = True, match = #ประเทศไทย
Input: #ฟรี = True, match = #ฟรี
Input: #日本語ハッシュタグ = True, match = #日本語ハッシュタグ
Input: #日本語ハッシュタグ = True, match = #日本語ハッシュタグ
Input: これはOK #ハッシュタグ = True, match = #ハッシュタグ
Input: これもOK。#ハッシュタグ = True, match = 。#ハッシュタグ
Input: これはダメ#ハッシュタグ = False
Input: #1 = False
Input: #2 = False