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

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

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

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

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

33
задан Mark Byers 1 May 2010 в 17:01
поделиться

4 ответа

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

^(mailto|ftp|joe)

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

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

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

60
ответ дан 27 November 2019 в 17:43
поделиться

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

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

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

1
ответ дан 27 November 2019 в 17:43
поделиться

Метод StartsWith будет быстрее, поскольку нет накладных расходов на интерпретацию регулярного выражения, но вот как это делается:

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

Символ ^ обозначает начало строки. Между круглыми скобками можно поместить любые протоколы, разделенные символами |.

edit:

Другой подход, который намного быстрее, заключается в получении начала строки и использовании его в переключателе. Переключатель создает хэш-таблицу со строками, так что это быстрее, чем сравнивать все строки:

int index = theString.IndexOf(':');
if (index != -1) {
  switch (theString.Substring(0, index)) {
    case "mailto":
    case "ftp":
    case "joe":
      // do something
      break;
  }
}
7
ответ дан 27 November 2019 в 17:43
поделиться

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

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

Чтобы разбить это на части:

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

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

19
ответ дан 27 November 2019 в 17:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: