检查字符串是以“mailto”,“ftp”还是“joe”或......开头的正则表达式是什么?
现在我正在使用C#和类似的代码,如果有很多ors:
String.StartsWith("mailto:")
String.StartsWith("ftp")
看起来正则表达式会更好。或者我在这里缺少一种C#方式吗?
答案 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)
以下内容将匹配以mailto
,ftp
或http
开头的任何字符串:
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方法。
在您的情况下,只有在计划将来实施更复杂的字符串比较时,才应使用正则表达式。
答案 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");