使用正则表达式删除分隔符之间的子字符串从左到右 - C#

时间:2015-04-07 12:07:11

标签: c# regex

我正在尝试使用正则表达式从字符串中删除子字符串,从左到右,这意味着我想要识别正确的分隔符,然后删除所有内容,直到在左边找到最接近的分隔符(不是其他方式)周围,​​左右分隔符是不同的)。

一个例子:

string myInput = "This [[ should stay  and [[ this sould go | this should stay ]] as well";
string  myRegex = "\\[\\[(.*?)\\|";
string myOutput = Regex.Replace (myInput, myRegex,"");

我想删除" |"中的所有内容第一个" [["在左边,但正则表达式从第一个" [["在句子中直到" |"。

I get: myOutput = "This  this should stay ]] as well"

When what I really want is: "This [[ should stay  and this should stay ]] "

非常感谢!

3 个答案:

答案 0 :(得分:0)

你需要使用否定的先行断言。

myOutput = Regex.Replace(myInput, @"\[\[(?:(?!\[\[).)*?\|", "");

DEMO

(?:(?!\[\[).)*?会匹配任何字符,但不会与[[非贪婪地匹配。也就是说,这将检查要匹配的角色不会成为[[中的第一个角色的条件。如果是,那么它将匹配相应的字符,否则匹配将失败,因为实际遵循负向前瞻的模式是\|匹配文字管道符号),它期望立即跟随管道符号

答案 1 :(得分:0)

使用否定而不是.*令牌。另外,将您的模式放在逐字字符串文字中。

string myRegex = @"\[\[[^[|]*\|";

Ideone Demo

答案 2 :(得分:0)

使用此代码,我添加了一个否定的字符类,以确保我们在双[之后无法捕获[

 string myInput = "This [[ should stay  and [[ this sould go | this should stay ]] as well";
 string myRegex = @"\[\[([^\[]*?)\|";
 string myOutput = Regex.Replace(myInput, myRegex, "");

输出:

This [[ should stay  and  this should stay ]] as well

查看sample program