正则表达式:检索第一个斜杠之前的所有内容。

3

我需要一个正则表达式,可以基本上获取字符串的第一部分,在第一个斜杠()之前。

例如在下面的字符串中:

C:\MyFolder\MyFile.zip

我需要的部分是 "C:"

另一个例子:

somebucketname\MyFolder\MyFile.zip

我需要 "somebucketname"

我还需要一个正则表达式来检索它的“右边”部分,因此在第一个斜杠之后的所有内容(不包括斜杠)。

例如

somebucketname\MyFolder\MyFile.zip

将返回

MyFolder\MyFile.zip


1
你真的需要用正则表达式吗?这个问题似乎有点杀鸡焉用牛刀。 - auujay
@jasonbar - 必须设置非贪婪标志,否则在第一个示例中它会捕获 MyFile.zip 之前的所有内容,而 Alex 只想要 C:。 - Andy Shellam
6个回答

4

您不需要正则表达式(对于这样一个简单的问题,它会产生太多的开销),请尝试使用以下方法:

yourString = yourString.Substring(0, yourString.IndexOf('\\'));

如果要查找第一个斜杠后面的所有内容,可以按照以下方式操作:

yourString = yourString.Substring(yourString.IndexOf('\\') + 1);

1
还有第二个例子 yourString.Substring(yourString.LastIndexOf(''));。 - Andy Shellam
不是那样的... 它只会返回MyFile.zip - 我需要MyFolder\MyFile.zip - Alex
@alex - 我认为Andy误解了你的问题 - 我编辑了我的答案,提供了两个解决方案。 - Andrew Hare

3
使用.NET正则表达式引擎可以很好地解决这个问题。使.NET正则表达式真正好的是能够使用命名组捕获。使用命名组捕获允许您为每个感兴趣的正则表达式部分定义一个名称“捕获”,以便稍后可以引用它的值。组捕获的语法是“(?xx一些正则表达式xx)”。在项目中使用正则表达式时,请记得包含“System.Text.RegularExpressions”导入声明。祝愉快!//正则表达式
  string _regex = @"(?<first_part>[a-zA-Z:0-9]+)\\{1}(?<second_part>(.)+)";

  //Example 1
  {
    Match match = Regex.Match(@"C:\MyFolder\MyFile.zip", _regex, RegexOptions.IgnoreCase);
    string firstPart = match.Groups["first_part"].Captures[0].Value;
    string secondPart = match.Groups["second_part"].Captures[0].Value;
  }

  //Example 2
  {
    Match match = Regex.Match(@"somebucketname\MyFolder\MyFile.zip", _regex, RegexOptions.IgnoreCase);
    string firstPart = match.Groups["first_part"].Captures[0].Value;
    string secondPart = match.Groups["second_part"].Captures[0].Value;
   }

2

您知道.NET的文件处理类可以更加优雅地完成这个操作,对吧?

例如,在您最后的示例中,您可以这样做:

FileInfo fi = new FileInfo(@"somebucketname\MyFolder\MyFile.zip");
string nameOnly = fi.Name;

第一个例子可以做如下处理:

FileInfo fi = new FileInfo(@"C:\MyFolder\MyFile.zip");
string driveOnly = fi.Root.Name.Replace(@"\", "");

虽然这样做是可行的,但创建一个FileInfo实例似乎有些过度,因为简单的子字符串就可以完成工作了,不是吗? - Andrew Hare
同意,我只会在必要时使用正则表达式。内置类可以轻松处理这些事情,并且避免了未来由于正则表达式引起的问题而导致的烦恼。 - Pat
1
是的,但正则表达式也可以;-) 这取决于此处代码需要做什么 - 如果它需要对其中一个文件进行某种操作,那么不算过度。 - Andy Shellam
是的,它不是文件系统,我使用的是Amazon S3 - 我将bucket名称与文件名连接起来,以便为文件创建类似于文件系统的路径... - Alex
@alex - 如果是这样,System.IO.FileInfo和System.IO.DirectoryInfo类可能适合你(也可能不适合)。 - Andy Shellam

1

这将匹配所有非 \ 字符

[^\\]*

0

这里是使用“贪婪”运算符“?”的正则表达式解决方案...

        var pattern = "^.*?\\\\";
        var m = Regex.Match("c:\\test\\gimmick.txt", pattern);
        MessageBox.Show(m.Captures[0].Value);

0

按斜杠分割,然后获取第一个项目

words = s.Split('\\');
words[0]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接