Подтвердить что ты не робот

Шаблон Regex для проверки, начинается ли строка с определенной подстроки?

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

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

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

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

4b9b3361

Ответ 1

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

^(mailto|ftp|joe)

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

Метод 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;
  }
}

Ответ 4

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

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

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