我正在尝试匹配两个标记/标记之间的文本:
-- #begin free text
this is the first bit of text I want to match
blah blah blah
this is the end of the matching text
-- #end free text
我已设法使用以下.Net Regex
执行此操作(?s)(?<=-- #begin free text\s*)(?<freeText>(.+?))(?=\s+-- #end free text)
而不是以“this is the ......”开头的匹配,它也匹配前两个回车符,即“\ n \ n这是......”
如何确保匹配中不包含前面的回车符(最多n个)?
答案 0 :(得分:1)
使用此:
(?s)(?<=-- #begin free text\s*)\S.*?(?=\s*-- #end free text)
在C#中:
var myRegex = new Regex(@"(?s)(?<=-- #begin free text\s*)\S.*?(?=\s*-- #end free text)", RegexOptions.Multiline);
string resultString = myRegex.Match(yourString).Value;
Console.WriteLine(resultString);
比赛:
this is the first bit of text I want to match\nblah blah blah\nthis is the end of the matching text
<强>解释强>
(?s)
激活DOTALL
模式,允许点跨行匹配(?<=-- #begin free text\s*)
匹配起始分隔符和可选空格\S
匹配非空格字符(开始匹配).*?
懒惰地匹配任何字符...... (?=\s*-- #end free text)
可以断言后面的内容是可选的空白字符结束结尾分隔符的位置答案 1 :(得分:1)
你真的需要外表吗?这对我有用:
Regex r = new Regex(
@"(?s)-- #begin free text\s+(?<freeText>(.+?))\s+-- #end free text");
text = r.Match(subjectString).Groups["name"].Value;
当你需要它们时,外观非常宝贵,但大部分时间它们都会妨碍你。对于.NET正则表达式来说,这更不正确了。&#34;任何事情都会发生。 lookbehinds,但它仍然适用。