3

我有表格中的字符串[abc].[some other string].[can.also.contain.periods].[our match]

我现在想匹配字符串“我们的匹配”(即不带括号),所以我玩了环顾四周之类的东西。我现在得到了正确的匹配,但我认为这不是一个干净的解决方案。

(?<=\.?\[)     starts with '[' or '.['
([^\[]*)      our match, i couldn't find a way to not use a negated character group
              `.*?` non-greedy did not work as expected with lookarounds,
              it would still match from the first match
              (matches might contain escaped brackets)
(?=\]$)       string ends with an ]

语言是 .net/c#。如果有一个不涉及正则表达式的更简单的解决方案,我也很高兴知道

真正让我恼火的是,我不能用(.*?)它来捕获字符串,因为看起来非贪婪不适用于lookbehinds。

我也试过:Regex.Split(str, @"\]\.\[").Last().TrimEnd(']');,但我也不是很喜欢这个解决方案

4

4 回答 4

5

以下应该可以解决问题。假设字符串在最后一次匹配之后结束。

string input = "[abc].[some other string].[can.also.contain.periods].[our match]";

var search = new Regex("\\.\\[(.*?)\\]$", RegexOptions.RightToLeft);

string ourMatch = search.Match(input).Groups[1]);
于 2010-06-25T11:50:32.763 回答
4

假设您可以保证输入格式,并且它只是您想要的最后一个条目,LastIndexOf可以使用:

string input = "[abc].[some other string].[can.also.contain.periods].[our match]";

int lastBracket = input.LastIndexOf("[");
string result = input.Substring(lastBracket + 1, input.Length - lastBracket - 2);
于 2010-06-25T11:32:26.410 回答
0

使用 String.Split():

string input = "[abc].[some other string].[can.also.contain.periods].[our match]";
char[] seps = {'[',']','\\'};
string[] splitted = input.Split(seps,StringSplitOptions.RemoveEmptyEntries);

您在 splitted[7] 中得到“out match”,并且 can.also.contain.periods 保留为一个字符串(splitted[4])

编辑:数组将在 [] 内包含字符串,然后是 . 依此类推,因此,如果您有可变数量的组,则可以使用它来获取所需的值(或删除只是“。”的字符串)

编辑为将反斜杠添加到分隔符以处理类似 '\[abc\]' 的情况

Edit2:对于嵌套 []:

string input = @"[abc].[some other string].[can.also.contain.periods].[our [the] match]";
string[] seps2 = { "].["};
string[] splitted = input.Split(seps2, StringSplitOptions.RemoveEmptyEntries);

你我们的 [the] match] 在最后一个元素(索引 3)中,你必须删除额外的 ]

于 2010-06-25T10:04:38.630 回答
0

你有几个选择:

  • RegexOptions.RightToLeft- 是的,.NET 正则表达式可以做到这一点!用它!
  • 用贪婪前缀匹配整个事物,使用括号捕获您感兴趣的后缀

参考

于 2010-06-25T10:25:23.153 回答