我想使用正则表达式基于开始和结束字符创建一个字符串数组。
一个例子可以帮助我解释。 考虑'$'作为我的起始标识符和'|'作为我的结束标识符来自以下字符串
堆叠 $ 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
答案 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");