Шаблон регулярного выражения для проверки, начинается ли строка с определенной подстроки? - PullRequest
31 голосов
/ 01 мая 2010

Какое регулярное выражение проверяет, начинается ли строка с «mailto», «ftp», «joe» или ...

Теперь я использую C # и код, подобный этому, в большом, если со многими ors:

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

Похоже, что регулярное выражение было бы лучше для этого. Или есть C #, как мне здесь не хватает?

Ответы [ 5 ]

58 голосов
/ 01 мая 2010

Вы можете использовать:

^(mailto|ftp|joe)

Но, если честно, StartsWith здесь прекрасно. Вы можете переписать его следующим образом:

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

Вы также можете посмотреть на класс System.Uri, если анализируете URI.

17 голосов
/ 01 мая 2010

Следующие значения будут соответствовать любой строке, начинающейся с mailto, ftp или http:

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

Чтобы разбить его:

  • ^ соответствует началу строки
  • (mailto|ftp|http) соответствует любому из элементов, разделенных |

Я бы нашел StartsWith более читабельным в этом случае.

6 голосов
/ 01 мая 2010

Метод 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;
  }
}
1 голос
/ 01 мая 2010

Я действительно рекомендую использовать метод String.StartsWith вместо Regex.IsMatch, если вы планируете проверять только начало строки.

  • Во-первых, регулярное выражение в C # это язык на языке с не поможет понимание и код поддержание. Регулярное выражение является вид DSL .
  • Во-вторых, многие разработчики не понимать регулярные выражения: это что-то непонятное для многих людей.
  • В-третьих, метод StartsWith приносит Вы особенности, чтобы включить культуру зависимое сравнение, которое регулярно выражения не знают.

В вашем случае вы должны использовать регулярные выражения только в том случае, если вы планируете реализовать более сложное сравнение строк в будущем.

0 голосов
/ 07 ноября 2018

Для метода расширения вентиляторов:

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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...