如何查找由特定开始和结束字符分隔的字符串

时间:2012-01-08 07:01:09

标签: c# regex

我想使用正则表达式基于开始和结束字符创建一个字符串数组。

一个例子可以帮助我解释。 考虑'$'作为我的起始标识符和'|'作为我的结束标识符来自以下字符串

  

堆叠 $ over | 流量 $ stack | 交换

正则表达式应在上面的字符串中找到 over stack

[编辑在OP的评论中包含代码片段...]

string testingString = "stack $over| flow $stack| exchange"; 
var pattern = @"(?$.*?|)"; // also tried @"\$[^|]\|" 
foreach (var m in System.Text.RegularExpressions.Regex.Split(testingString, pattern)) {     
    Response.Write(m ); 
} 
// output == stack $over| flow $stack| exchange 

2 个答案:

答案 0 :(得分:2)

我会使用look-behind和look-aheads来排除匹配的开始和结束分隔符。

string testingString = @"stack $over| flow $stack| exchange";

MatchCollection result = Regex.Matches
    (testingString,
            @"       
                (?<=\$)  # This is a lookbehind, it ensure there is a $ before the string
                [^|]*    # Match any character that is not a |
                (?=\|)   # This is a lookahead,it ensures that a | is ahead the pattern
            "
            , RegexOptions.IgnorePatternWhitespace);

foreach (Match item in result) {
    Console.WriteLine(item.ToString());
}

RegexOptions.IgnorePatternWhitespace是一个有用的选项,可以编写可读的正则表达式并在正则表达式中使用注释。

答案 1 :(得分:1)

在正则表达式中$是一个特殊字符,意思是“匹配字符串的结尾”。 对于文字$,您需要转义它,请尝试\$

同样|是正则表达式中的特殊字符,需要进行转义。

尝试\$.*?\|\$[^|]+\|

了解网络中的正则表达式,例如here

[UPDATE] 在回复您的评论时,您希望提取$|分隔的文本,而不是在其上拆分。请尝试使用Regex.Matches代替Regex.Split

Regex t = new Regex(@"\$([^|]+)\|");
MatchCollection allMatches = t.Matches("stack $over| flow $stack| exchange");