regex 如何创建参数化的正则表达式(根据C#的术语),它匹配由自定义多字符分隔符分隔的字符串?

0md85ypi  于 2023-06-30  发布在  C#
关注(0)|答案(1)|浏览(102)

我想在文本中找到字符串。文本可以包含多行。字符串可以由自定义分隔符分隔-这应该参数化。文本中可以有多个字符串,甚至在一行中。例如:如果定界符是(三个双引号):"""然后在本文中:
lorem ipsum“““findthis”””“但不是this”'也不是this'“”“anotherstringtofind”"”
““blabla”要查找的另一个”文本“
它应该找到:findthisanotherstringtofind,* 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#中使用正则表达式来解决这个问题?感谢您的评分

zyfwsgd6

zyfwsgd61#

你可以使用惰性量词来代替求反字符类。在您的示例中,使用“应该会导致像"""(.*?)"""这样的正则表达式
另外,请注意,您当前的尝试错误地使用了字符类作为分隔符,因为["""]等效于["],进而又等效于简单的"。按原样使用分隔符,而不使用任何额外的 Package 器。
但是在正则表达式中使用之前,不要忘记转义分隔符。所以,如果你在正则表达式中有像[]这样的分隔符,它应该是\[\]
你的方法看起来像这样:

public static MatchCollection FindString(string input, string delimiter, RegexOptions regexOptions = RegexOptions.Multiline)
{
    string pattern = string.Format("{0}(.*?){0}", Regex.Escape(delimiter));
    var rx = new Regex(pattern, regexOptions);
    return rx.Matches(input);
}

甚至有可能“否定”整个字符序列吗
是的,有可能:(?:(?!foo).)+可以用来匹配这样的东西。例如"""(?:(?!""").)*"""。但与简单的惰性量词相比,它的性能要差得多。

相关问题