web-dev-qa-db-ja.com

文字列が特定の部分文字列で始まるかどうかをチェックするための正規表現パターン?

文字列が「mailto」または「ftp」または「joe」で始まるかどうかをチェックする正規表現は何ですか...

今、私はC#とこのようなコードを多くのORで大きなifで使用しています:

String.StartsWith("mailto:")
String.StartsWith("ftp")

これには正規表現が適しているようです。または、ここで欠けているC#の方法はありますか?

31
kacalapy

次を使用できます。

^(mailto|ftp|joe)

しかし、正直に言うと、StartsWithはこれでまったく問題ありません。次のように書き換えることができます。

string[] prefixes = { "http", "mailto", "joe" };
string s = "joe:bloggs";
bool result = prefixes.Any(prefix => s.StartsWith(prefix));

System.Uri URIを解析する場合はクラス。

58
Mark Byers

以下は、mailtoftp、またはhttpで始まる文字列に一致します。

 RegEx reg = new RegEx("^(mailto|ftp|http)");

分解するには:

  • ^は行の先頭に一致します
  • (mailto|ftp|http)は、|で区切られた任意のアイテムと一致します

この場合、StartsWithがより読みやすくなります。

17
Oded

正規表現を解釈するオーバーヘッドがないため、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;
  }
}
6
Guffa

文字列の先頭のみをチェックする場合は、Regex.IsMatchよりもString.StartsWithメソッドを使用することをお勧めします。

  • まず、C#の正規表現は、言語の言語であり、理解とコードのメンテナンスに役立ちません。正規表現は一種の [〜#〜] dsl [〜#〜] です。
  • 第二に、多くの開発者は正規表現を理解していません。それは多くの人間にとって理解できないものです。
  • 3番目に、StartsWithメソッドは、正規表現が認識しないカルチャ依存の比較を有効にする機能を提供します。

あなたの場合、将来、より複雑な文字列比較の実装を計画する場合にのみ、正規表現を使用する必要があります。

1
Ucodia

拡張方式のファンの場合:

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");
0
K. R.