Шаблон Regex для проверки, начинается ли строка с определенной подстроки?
Какое регулярное выражение проверяет, начинается ли строка с "mailto" или "ftp" или "joe" или...
Теперь я использую С# и код вроде этого в большом, если со многими ors:
String.StartsWith("mailto:")
String.StartsWith("ftp")
Похоже, регулярное выражение было бы лучше для этого. Или есть С#, которого я здесь не хватает?
Ответы
Ответ 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 приносит
вы можете включить культуру
зависимое сравнение, которое
выражения не знают.
В вашем случае вы должны использовать регулярные выражения только в том случае, если вы планируете внедрять более сложное сравнение строк в будущем.