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

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

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

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

 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); 

我更喜欢第一种方法。

当字符串中没有短划线时,您还需要考虑行为。 在这种情况下,第四种方法将引发exception,因为text.IndexOf("-")将为-1 。 方法1和2.1将不返回任何内容,方法2和3将返回完整的字符串。

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

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

 [^-]* 

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

 ([^-]*)- 

JavaScript中的快速测试:

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

您可以使用另一种基于非正则表达式的方法。 有人给出了使用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 。

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

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