文字列が「mailto」または「ftp」または「joe」で始まるかどうかをチェックする正規表現は何ですか...
今、私はC#とこのようなコードを多くのORで大きなifで使用しています:
String.StartsWith("mailto:")
String.StartsWith("ftp")
これには正規表現が適しているようです。または、ここで欠けているC#の方法はありますか?
次を使用できます。
^(mailto|ftp|joe)
しかし、正直に言うと、StartsWith
はこれでまったく問題ありません。次のように書き換えることができます。
string[] prefixes = { "http", "mailto", "joe" };
string s = "joe:bloggs";
bool result = prefixes.Any(prefix => s.StartsWith(prefix));
System.Uri
URIを解析する場合はクラス。
以下は、mailto
、ftp
、またはhttp
で始まる文字列に一致します。
RegEx reg = new RegEx("^(mailto|ftp|http)");
分解するには:
^
は行の先頭に一致します(mailto|ftp|http)
は、|
で区切られた任意のアイテムと一致しますこの場合、StartsWith
がより読みやすくなります。
正規表現を解釈するオーバーヘッドがないため、StartsWithメソッドはより高速になりますが、次のようにします。
if (Regex.IsMatch(theString, "^(mailto|ftp|joe):")) ...
^
は、文字列の先頭をつなぎ合わせます。 |
文字で区切られた括弧の間に任意のプロトコルを配置できます。
はるかに高速なもう1つのアプローチは、文字列の先頭を取得してスイッチで使用することです。スイッチは文字列でハッシュテーブルを設定するため、すべての文字列を比較するよりも高速です。
int index = theString.IndexOf(':');
if (index != -1) {
switch (theString.Substring(0, index)) {
case "mailto":
case "ftp":
case "joe":
// do something
break;
}
}
文字列の先頭のみをチェックする場合は、Regex.IsMatchよりもString.StartsWithメソッドを使用することをお勧めします。
あなたの場合、将来、より複雑な文字列比較の実装を計画する場合にのみ、正規表現を使用する必要があります。
拡張方式のファンの場合:
public static bool RegexStartsWith(this string str, params string[] patterns)
{
return patterns.Any(pattern =>
Regex.Match(str, "^("+pattern+")").Success);
}
使用法
var answer = str.RegexStartsWith("mailto","ftp","joe");
//or
var answer2 = str.RegexStartsWith("mailto|ftp|joe");
//or
bool startsWithWhiteSpace = " does this start with space or tab?".RegexStartsWith(@"\s");