我想在文本中找到字符串。文本可以包含多行。字符串可以由自定义分隔符分隔-这应该参数化。文本中可以有多个字符串,甚至在一行中。例如:如果定界符是(三个双引号):"""
然后在本文中:
lorem ipsum“““findthis”””“但不是this”'也不是this'“”“anotherstringtofind”"”
““blabla”要查找的另一个”文本“
它应该找到:findthis,anotherstringtofind,* yet another*,text to find.(注意,匹配的字符串中不存在分隔符,但如果需要,我可以使用C#删除它们。
我可以做一个类似的事情,只是一个字符分隔符:使用regex:"[{0}](([^{0}])*)[{0}]"
像这样:
public static MatchCollection FindString(this string input, char delimeter, RegexOptions regexOptions = RegexOptions.Multiline)
{
var regexString = string.Format("[{0}](([^{0}])*)[{0}]", delimeter);
var rx = new Regex(regexString, regexOptions);
MatchCollection matches = rx.Matches(input);
return matches;
}
我猜,解决方案将使用前瞻操作符,但我不知道如何将其与某些东西结合起来,这些东西在单个字符的情况下具有类似的效果,如[^]
。甚至有可能“否定”整个字符序列(不把它们放进匹配中)吗?
我认为this question是类似的,但我不熟悉Python。
有没有可能在C#中使用正则表达式来解决这个问题?感谢您的评分
1条答案
按热度按时间zyfwsgd61#
你可以使用惰性量词来代替求反字符类。在您的示例中,使用“应该会导致像
"""(.*?)"""
这样的正则表达式另外,请注意,您当前的尝试错误地使用了字符类作为分隔符,因为
["""]
等效于["]
,进而又等效于简单的"
。按原样使用分隔符,而不使用任何额外的 Package 器。但是在正则表达式中使用之前,不要忘记转义分隔符。所以,如果你在正则表达式中有像
[]
这样的分隔符,它应该是\[\]
。你的方法看起来像这样:
甚至有可能“否定”整个字符序列吗
是的,有可能:
(?:(?!foo).)+
可以用来匹配这样的东西。例如"""(?:(?!""").)*"""
。但与简单的惰性量词相比,它的性能要差得多。