要匹配的正则表达式模式,不包括...... /除外

要匹配的正则表达式模式,不包括...... /除外

 目前的答案有一些有用的想法,但我想要更完整的东西,我可以100%理解和重用; 这就是我设置赏金的原因。对于我来说,无处不在的想法比没有标准语法更好\K

这个问题是关于如何匹配模式除了某些情况s1 s2 s3。我举一个具体的例子来说明我的意思,但更喜欢我能100%理解的一般答案,所以我可以在其他情况下重复使用它。

我希望匹配五位数\b\d{5}\b但不能在三种情况下匹配s1 s2 s3:

s1:不在以句子这样的句号结尾的行上。

s2:在parens里面没有任何地方。

s3:不在以#开头if(和结尾的块内//endif

我知道如何使用前瞻和后视来解决s1 s2 s3中的任何一个,特别是在C#lookbehind或\KPHP中。

例如

S1 (?m)(?!\d+.*?\.$)\d+

s3与C#lookbehind (?<!if\(\D*(?=\d+.*?//endif))\b\d+\b

s3与PHP \ K (?:(?:if\(.*?//endif)\D*)*\K\d+

但条件的混合使我的头脑爆炸。更糟糕的是,我可能需要在其他时间添加其他条件s4 s5。

好消息是,我不在乎是否使用PHP,C#,Python或邻居的洗衣机等常用语言处理文件。:)我几乎是Python和Java的初学者,但有兴趣了解它是否有解决方案。

所以我来到这里看是否有人想到一个灵活的食谱。

提示没问题:你不需要给我完整的代码。:)

谢谢。


胡子哥哥
浏览 1418回答 3
3回答

婷婷同学_

进行三种不同的匹配,并使用程序中条件逻辑处理三种情况的组合。你不需要处理一个巨大的正则表达式中的所有东西。编辑:让我扩大一点,因为问题变得更有趣:-)您在此尝试捕获的一般想法是匹配某个正则表达式模式,但不是当测试字符串中存在某些其他(可能是任何数字)模式时。幸运的是,您可以利用您的编程语言:保持正则表达式简单,只需使用复合条件。最好的做法是在可重用的组件中捕获这个想法,所以让我们创建一个实现它的类和方法:using&nbsp;System.Collections.Generic;using&nbsp;System.Linq;using&nbsp;System.Text.RegularExpressions;public&nbsp;class&nbsp;MatcherWithExceptions&nbsp;{ &nbsp;&nbsp;private&nbsp;string&nbsp;m_searchStr; &nbsp;&nbsp;private&nbsp;Regex&nbsp;m_searchRegex; &nbsp;&nbsp;private&nbsp;IEnumerable<Regex>&nbsp;m_exceptionRegexes; &nbsp;&nbsp;public&nbsp;string&nbsp;SearchString&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;get&nbsp;{&nbsp;return&nbsp;m_searchStr;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_searchStr&nbsp;=&nbsp;value; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_searchRegex&nbsp;=&nbsp;new&nbsp;Regex(value); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;string[]&nbsp;ExceptionStrings&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;{&nbsp;m_exceptionRegexes&nbsp;=&nbsp;from&nbsp;es&nbsp;in&nbsp;value&nbsp;select&nbsp;new&nbsp;Regex(es);&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;bool&nbsp;IsMatch(string&nbsp;testStr)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_searchRegex.IsMatch(testStr) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&&&nbsp;!m_exceptionRegexes.Any(er&nbsp;=>&nbsp;er.IsMatch(testStr)) &nbsp;&nbsp;&nbsp;&nbsp;); &nbsp;&nbsp;}}public&nbsp;class&nbsp;App&nbsp;{ &nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;Main()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;mwe&nbsp;=&nbsp;new&nbsp;MatcherWithExceptions(); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Set&nbsp;up&nbsp;the&nbsp;matcher&nbsp;object. &nbsp;&nbsp;&nbsp;&nbsp;mwe.SearchString&nbsp;=&nbsp;@"\b\d{5}\b"; &nbsp;&nbsp;&nbsp;&nbsp;mwe.ExceptionStrings&nbsp;=&nbsp;new&nbsp;string[]&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@"\.$" &nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;@"\(.*"&nbsp;+&nbsp;mwe.SearchString&nbsp;+&nbsp;@".*\)" &nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;@"if\(.*"&nbsp;+&nbsp;mwe.SearchString&nbsp;+&nbsp;@".*//endif" &nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;testStrs&nbsp;=&nbsp;new&nbsp;string[]&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"1."&nbsp;//&nbsp;False &nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;"11111."&nbsp;//&nbsp;False &nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;"(11111)"&nbsp;//&nbsp;False &nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;"if(11111//endif"&nbsp;//&nbsp;False &nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;"if(11111"&nbsp;//&nbsp;True &nbsp;&nbsp;&nbsp;&nbsp;,&nbsp;"11111"&nbsp;//&nbsp;True &nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Perform&nbsp;the&nbsp;tests. &nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(var&nbsp;ts&nbsp;in&nbsp;testStrs)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Console.WriteLine(mwe.IsMatch(ts)); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;}}所以上面,我们设置了搜索字符串(五位数),多个异常字符串(你的s1,s2和s3),然后尝试匹配几个测试字符串。打印结果应如每个测试字符串旁边的注释中所示。

慕丝7291255

你的要求是,在所有情况下都不可能满足于parens。也就是说,如果你能以某种方式找到(左边和)右边的,它并不总是意味着你在内部。例如。(....) + 55555 + (.....)-不,在括号内部竟然有(和)左,右现在你可能会认为自己很聪明,(只有你)以前没有遇到过左边,反之亦然。这不适用于这种情况:((.....) + 55555 + (.....))- 即使有关闭),(左边和右边,也在内部。不可能发现你是否在使用正则表达式的parens中,因为正则表达式无法计算已经打开了多少个parens以及关闭了多少个parens。考虑这个更简单的任务:使用正则表达式,找出字符串中的所有(可能是嵌套的)parens是否已关闭,这是(您需要查找的每一个)。你会发现它是不可能解决的,如果你用正则表达式无法解决这个问题,那么你无法弄清楚一个单词是否在所有情况下都在parens中,因为你无法弄清楚字符串中的某个位置所有前面(都有相应的)。
打开App,查看更多内容
随时随地看视频慕课网APP