Регулярное выражение для получения всех символов до "-"

Как я могу получить строку перед символом "-" с помощью регулярных выражений?

Например, у меня есть "text-1", и я хочу вернуть "text".

Ответ 1

Поэтому я вижу много возможностей для достижения этого.

string text = "Foobar-test";

1) Regex Сопоставьте все до первого "-"

Match result = Regex.Match(text, @"^.*?(?=-)");
  • ^ соответствует началу строки
  • .*? соответствует любому символу (.), ноль или более раз (*), но как можно меньше (?)
  • (?=-), пока следующий символ не будет "-" (это положительный взгляд вперед).

2) Regex Сопоставьте все, что не является "-" , начиная с начала строки

Match result2 = Regex.Match(text, @"^[^-]*");
  • [^-]* соответствует любому символу, который не является "-" ноль или более раз

2) 1) Regex Сопоставьте все, что не является "-" , начиная с начала строки до "-"

Match result21 = Regex.Match(text, @"^([^-]*)-");
  • Будет только соответствовать, если в строке есть тире, но результат найден в группе захвата 1.

3) Разделить на "-"

string[] result3 = text.Split('-');
  • Результат - это массив, перед первым "-" - это первый элемент в массиве

4) Подстрока до первого "-"

string result4 = text.Substring(0, text.IndexOf("-"));
  • Получить подстроку из текста с самого начала до первого появления "-" (text.IndexOf("-"))

Вы получаете все результаты (все равно) с этим

Console.WriteLine(result);
Console.WriteLine(result2);
Console.WriteLine(result21.Groups[1]);
Console.WriteLine(result3[0]);
Console.WriteLine(result4);

Я бы предпочел первый метод.

Вам также нужно подумать о поведении, когда в строке нет нити. Четвертый метод будет генерировать исключение в этом случае, потому что text.IndexOf("-") будет -1. Метод 1 и 2.1 ничего не вернет, а метод 2 и 3 вернет полную строку.

Ответ 2

Вот мое предложение - это довольно просто:

[^-]*

Ответ 3

Я не думаю, что для этого вам нужно регулярное выражение. Я бы посмотрел на SubString вместе с indexOf. Если вам нужна дополнительная помощь, добавьте комментарий, показывающий, что вы пытались, и я предложу дополнительную помощь.

Ответ 4

Это что-то вроде регулярного выражения, которое вам нужно:

([^-]*)-

Быстрые тесты в JavaScript:

/([^-]*)-/.exec('text-1')[1] // 'text'

/([^-]*)-/.exec('foo-bar-1')[1] // 'foo'

/([^-]*)-/.exec('-1')[1] // ''

/([^-]*)-/.exec('quux')[1] // explodes

Ответ 5

Вы можете просто использовать другой метод, не основанный на регулярном выражении. Кто-то дал предложение использовать подстроку, но вы также можете использовать Split:

string testString = "my-string";
string[] splitString = testString.Split("-");
string resultingString = splitString[0]; //my

См. http://msdn.microsoft.com/en-US/library/ms228388%28v=VS.80%29.aspx для другого хорошего примера.

Ответ 6

Если вы хотите использовать RegEx в .NET,

Regex rx = new Regex(@"^([\w]+)(\-)*");
var match = rx.Match("thisis-thefirst");
var text = match.Groups[1].Value;
Assert.AreEqual("thisis", text);

Ответ 7

Найти все символы слова и пробела вплоть до -

^[\w ]+-