我必须找到某个字符串(针)在另一个字符串(haystack)中的出现,而这些字符串没有出现在特定的“大括号”之间。
例如考虑这个干草堆: “开始一些事情结束一些其他事情开始一些其他事情结束更多的事情。” 还有这个针: “一些” 用大括号“BEGIN”和“END”
我想找到所有不在大括号之间的针。 (有两个匹配项:“some”后跟“other”和“some”后跟“more”)
我认为我可以使用负前瞻/后视的正则表达式来解决这个问题,但如何解决?
我试过了
(?<!(BEGIN))some(?!(END))
这给了我 4 个匹配项(显然是因为“BEGIN”和“END”之间没有直接包含“some”)
我也试过
(?<!(BEGIN.*))some(?!(.*END))
但这根本没有给我任何匹配项(显然是因为每根针都以某种方式以“BEGIN”开头)
不,我卡住了。
这是我使用的最新 C# 代码:
string input = "BEGIN something END some other thing BEGIN something else END yet some more things.";
global::System.Text.RegularExpressions.Regex re = new Regex(@"(?<!(BEGIN.*))some(?!(.*END))");
global::System.Text.RegularExpressions.MatchCollection matches = re.Matches(input);
global::NUnit.Framework.Assert.AreEqual(2, matches.Count);
最佳答案
这样的事情对你有用吗:
(?:^|END)((?!BEGIN).*?)(some)(.*?)(?:BEGIN|$)
这似乎与您的文本匹配,正如我使用 RegExDesigner.NET 测试的那样。
关于用于特定区域外匹配的 C# 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5597564/