这个正则表达式如何运作?

时间:2016-02-24 16:31:25

标签: regex

output = System.Text.RegularExpressions.Regex.Replace(output, "(?s).*kucing(.*?)</tr>", "$1") + "</tr>"

我认为目的是做一些贪婪的搜索。

所以如果我们有bla bla bla kucing bla bla bla kucing bla bla bla kucing hello world

它应该匹配你好世界。但是,我忘记了我是如何设置它的。

我尝试了一堆正则表达式

?System.Text.RegularExpressions.Regex.Replace("Hello World kucing Hi Kitty Kucing I like cat", "(?s)(.*)kucing(.*)", "$2")
" Hi Kitty Kucing I like cat"
    ?System.Text.RegularExpressions.Regex.Replace("Hello World kucing Hi Kitty Kucing I like cat", "(?s).*kucing(.*)", "$1")
" Hi Kitty Kucing I like cat"
    ?System.Text.RegularExpressions.Regex.Replace("Hello World kucing Hi Kitty Kucing I like cat", "(?s)(.*)kucing(.*)", "$1")
"Hello World "
    ?System.Text.RegularExpressions.Regex.Replace("Hello World kucing Hi Kitty Kucing I like cat", "(?s)(.*)kucing(.*)", "$2")
" Hi Kitty Kucing I like cat"

我想要的是&#34;我喜欢猫&#34;。基本上我想要第一个。*贪婪和匹配&#34; Hello World kucing Hi Kitty Kucing&#34;。我想让它走到最后#Ku;&#34;。然后我想删除那部分并抓住剩下的部分。

我该怎么做?

2 个答案:

答案 0 :(得分:2)

(?s)从多线(默认)切换到单线

此外,当c#regex区分大小写时,您的代码不会返回预期结果,因为您使用kucing代替Kucing

您可以这样使用:

string str = "Hello World kucing Hi Kitty Kucing I like cat";

string s = Regex.Replace(str, "(.*)kucing(.*)", "$2",
    RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Compiled);

string s2 = Regex.Replace(str, "(.*)kucing\\s*(.*)", "$2",
    RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Compiled);

Console.WriteLine(s);
Console.WriteLine(s2);

\s表示空格。

输出:

 I like cat
I like cat

答案 1 :(得分:1)

对于初学者,如果您想测试正则表达式,此网站可能会对您有所帮助:https://regex101.com/
进一步使这个正则表达式工作,你至少需要逃避斜线。

(?s).*kucing(.*?)<\/tr>
  

基本上我希望正则表达式引擎转到最后一个“kucing”然后转到下一个。然后删除所有内容。

您能否详细解释一下您打算做什么?逻辑上,在最后一个之后不会有下一个'kucing'。请澄清。