正则表达式让我很难过

时间:2014-06-18 02:25:01

标签: c# regex

您正在尝试解决正则表达式问题

我有一个公式解析器需要在某些标签中获取字符串,输入字符串将如下所示:

[//part1/part2/abc]+[/def]+[ghi]

我想要归还的只有三组:

abc
def
ghi

我有一个部分工作的正则表达式,它给我三个组,方括号之间的字符串,但我只是无法摆脱前缀路径。

如果有路径,它将始终使用正斜杠。

\[(.*?)\]

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

尝试使用以下正则表达式在]括号

之前捕获一个或多个单词字符
(\w+)\]

DEMO

答案 1 :(得分:3)

你可以试试这个:

@"\[(?:[^]/]*/)*([^]/]+)]"

可选的非捕获组将以斜杠匹配所有结尾。

答案 2 :(得分:2)

直接匹配(无捕获)

这个正则表达式有点复杂,因为我们不是捕获你想要的第1组,而是直接匹配它。

正则表达式还验证我们位于[brackets]

(?x)                # free-spacing mode
(?<=                # look behind: we should see
\[                  # an opening bracket, then
(?:(?:[^/\]]*/+)+)? # optionally, one or more series of 
                    # non-slashes, non-closing brackets followed by slashes
)                   # end lookbehind
[^/\]]*             # this is what we want to match: any character that is not a / or a ]
(?=[^/]*\])         # lookahead: we should see no slashes, then a closing ]

请参阅demo

您可以在这种自由间距模式下实际使用它,这使以后易于维护和理解。解释在评论中。

在C#代码中

以下是在C#中使用此正则表达式的一种方法:

Regex yourRegex = new Regex(@"(?x) #free-spacing mode
(?<=                # look behind: we should see
\[                  # an opening bracket, then
(?:(?:[^/\]]*/+)+)? # optionally, one or more series of 
                    # non-slashes, non-closing brackets followed by slashes
)                   # end lookbehind
[^/\]]*             # this is what we want to match: any character that is not a / or a ]
(?=[^/]*\])         # lookahead: we should see no slashes, then a closing ]
");

allMatchResults = yourRegex.Matches(yourstring);
if (allMatchResults.Count > 0) {
 // Access individual matches using allMatchResults.Item[]
}