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

Dan*_*inu 17 .net c# regex

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

例如,我有"text-1",我想要回来"text".

ste*_*ema 90

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

string text = "Foobar-test";
Run Code Online (Sandbox Code Playgroud)

1)正则表达式匹配所有内容直到第一个" - "

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

2)正则表达式从字符串的开头匹配任何不是" - "的东西

Match result2 = Regex.Match(text, @"^[^-]*");
Run Code Online (Sandbox Code Playgroud)
  • [^-]* 匹配任何不是" - "的字符零次或多次

2)1)正则表达式从字符串的开头匹配任何不是" - "的东西,直到" - "

Match result21 = Regex.Match(text, @"^([^-]*)-");
Run Code Online (Sandbox Code Playgroud)
  • 只有在字符串中有短划线时才会匹配,但结果会在捕获组1中找到.

3)拆分" - "

string[] result3 = text.Split('-');
Run Code Online (Sandbox Code Playgroud)
  • 结果是一个数组,第一个" - "之前的部分是数组中的第一个项目

4)子串直到第一个" - "

string result4 = text.Substring(0, text.IndexOf("-"));
Run Code Online (Sandbox Code Playgroud)
  • 从开头到第一次出现" - "(text.IndexOf("-"))获取文本中的子字符串

然后你得到所有的结果(都是一样的)

Console.WriteLine(result);
Console.WriteLine(result2);
Console.WriteLine(result21.Groups[1]);
Console.WriteLine(result3[0]);
Console.WriteLine(result4);
Run Code Online (Sandbox Code Playgroud)

我更喜欢第一种方法.

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


dav*_*ers 6

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

([^-]*)-
Run Code Online (Sandbox Code Playgroud)

JavaScript 中的快速测试:

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

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

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

/([^-]*)-/.exec('quux')[1] // explodes
Run Code Online (Sandbox Code Playgroud)

  • 尽管 C# 和 JS 具有类似的正则表达式语法,但它们并不完全相同。使用 JavaScript 来测试任何其他风格的正则表达式是不明智的...... (2认同)

Fis*_*aen 6

这是我的建议-就这么简单:

[^-]*
Run Code Online (Sandbox Code Playgroud)


sea*_*nzi 5

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