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() {"#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 : ""))); } }