用于检查字符串是否以某个子字符串开头的正则表达式模式?

时间:2010-05-01 16:49:14

标签: c# asp.net regex

检查字符串是以“mailto”,“ftp”还是“joe”或......开头的正则表达式是什么?

现在我正在使用C#和类似的代码,如果有很多ors:

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

看起来正则表达式会更好。或者我在这里缺少一种C#方式吗?

5 个答案:

答案 0 :(得分:57)

您可以使用:

^(mailto|ftp|joe)

但说实话,StartsWith在这里完全没问题。您可以按如下方式重写它:

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

如果要解析URI,还可以查看System.Uri类。

答案 1 :(得分:17)

以下内容将匹配以mailtoftphttp开头的任何字符串:

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

要打破它:

  • ^匹配行首
  • (mailto|ftp|http)匹配由|
  • 分隔的所有项目

在这种情况下,我会发现StartsWith更具可读性。

答案 2 :(得分:6)

StartsWith方法会更快,因为没有解释正则表达式的开销,但这是你如何做的:

if (Regex.IsMatch(theString, "^(mailto|ftp|joe):")) ...

^匹配字符串的开头。您可以在括号之间放置|个字符的任何协议。

编辑:

另一种快得多的方法是获取字符串的开头并在开关中使用。交换机使用字符串设置哈希表,因此它比比较所有字符串更快:

int index = theString.IndexOf(':');
if (index != -1) {
  switch (theString.Substring(0, index)) {
    case "mailto":
    case "ftp":
    case "joe":
      // do something
      break;
  }
}

答案 3 :(得分:1)

如果您只打算检查字符串的开头,我真的建议在Regex.IsMatch上使用String.StartsWith方法。

  • 首先,C#中的正则表达式 是一种语言的语言 不理解和编码 保养。正则表达式是一个 有点DSL
  • 其次,许多开发人员没有 理解正则表达式:它是 一些不可理解的东西 对于许多人来说。
  • 第三,StartsWith方法带来了 你的功能,以实现文化 依赖比较哪些是常规 表达式不知道。

在您的情况下,只有在计划将来实施更复杂的字符串比较时,才应使用正则表达式。

答案 4 :(得分:0)

对于扩展方法迷:

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");