正则表达式获取“ - ”之前的所有字符

时间:2011-11-22 09:07:11

标签: c# .net regex

如何使用正则表达式在字符"-"之前获取字符串?

例如,我有"text-1",我想返回"text"

7 个答案:

答案 0 :(得分:79)

所以我看到很多可能实现这一目标。

string text = "Foobar-test";

1)正则表达式将所有内容匹配到第一个“ - ”

Match result = Regex.Match(text, @"^.*?(?=-)");
  • ^匹配字符串的开头
  • .*?匹配任何字符(.),零次或多次(*),但尽可能少(?
  • (?=-)直到下一个字符是“ - ”(这是一个积极的向前看)

2)正则表达式从字符串的开头匹配任何不是“ - ”的内容

Match result2 = Regex.Match(text, @"^[^-]*");
  • [^-]*匹配任何不是“ - ”零或更多次的字符

2)1)正则表达式从字符串的开头匹配任何不是“ - ”的内容,直到“ - ”

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将返回完整的字符串。

答案 1 :(得分:4)

我认为你不需要正则表达式来实现这一目标。我会查看SubString方法以及indexOf方法。如果您需要更多帮助,请添加评论以显示您的尝试,我将提供更多帮助。

答案 2 :(得分:4)

这是我的建议 - 它非常简单:

[^-]*

答案 3 :(得分:2)

这类似于您需要的正则表达式:

([^-]*)-

JavaScript中的快速测试:

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

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

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

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

答案 4 :(得分:2)

您可以使用另一种基于非正则表达式的方法。有人给出了使用Substring的建议,但您也可以使用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了解另一个好例子。

答案 5 :(得分:1)

如果你想在.NET中使用RegEx,

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

答案 6 :(得分:0)

查找所有单词和空格字符,直到-包括-

^[\w ]+-