为什么我的C#正则表达式行间不匹配?

为什么我的C#正则表达式行间不匹配?,c#,regex,multiline,C#,Regex,Multiline,我在C#中有以下正则表达式: Regex h1Separator=newregex(@“(?'name'[\w\d\s]+?)()?”,RegexOptions.Singleline); 正在尝试匹配如下所示的字符串: <h1>test content<br> </h1> 测试内容 现在,它匹配如下所示的字符串: <h1>test content<br></h1> <h1>test content</

我在C#中有以下正则表达式:

Regex h1Separator=newregex(@“(?'name'[\w\d\s]+?)()?”,RegexOptions.Singleline);
正在尝试匹配如下所示的字符串:

<h1>test content<br>
</h1>
测试内容
现在,它匹配如下所示的字符串:

<h1>test content<br></h1>
<h1>test content</h1>
测试内容
测试内容

我做错了什么?我应该匹配换行符吗?如果是,C#中是什么?我找不到。

C中的换行符是:
\n
。但是,我对正则表达式不太熟悉,无法告诉您如果正则表达式中有换行符会发生什么。

C中的换行符是:
\n
。但是,我对正则表达式不太熟悉,无法告诉您如果正则表达式中有换行符会发生什么情况。

您将其定义为单行正则表达式,请参见
RegexOptions。Singleline
标志:)使用
RegexOptions。多行
您将其定义为单行正则表达式,请参阅
RegexOptions。单线
标志:)使用
RegexOptions。多线
使用多线标志。(编辑以解决我关于.Net平台的错误表述)

单线模式将传递的整个字符串视为一个条目。因此,
^
$
代表整个字符串,而不是字符串中一行的开始和结束。示例
(?'name'[\w\d\s]+?)()?
将与此匹配:

<h1>test content<br></h1> 
将匹配所需的模式:

<h1>test content<br> 
</h1> 
测试内容
简而言之,您需要告诉正则表达式解析器您希望使用多行。有一个讲你的regex方言的regex设计师会很有帮助。有许多。请使用多行标志。(编辑以解决我关于.Net平台的错误表述)

单线模式将传递的整个字符串视为一个条目。因此,
^
$
代表整个字符串,而不是字符串中一行的开始和结束。示例
(?'name'[\w\d\s]+?)()?
将与此匹配:

<h1>test content<br></h1> 
将匹配所需的模式:

<h1>test content<br> 
</h1> 
测试内容

简而言之,您需要告诉正则表达式解析器您希望使用多行。有一个讲你的regex方言的regex设计师会很有帮助。有很多。

您不会检查br标记末尾和下一个标记开头之间的空格,因此它希望在后面立即看到hr标记。在这两者之间添加一个“\s*”。

您不会检查br标记的结尾和下一个标记的开头之间是否有空格,因此它希望在后面立即看到hr标记。在两者之间添加一个“*”。

您可以在
结尾之前的字符串中添加一个点
,并保留
RegexOptions.Singleline
选项,或者将其更改为
RegexOptions.Multiline
并在
前面的regex中添加一个
$/code>。详细信息您可以在字符串的
结尾之前添加一个点
,并保留
RegexOptions.Singleline
选项,或者将其更改为
RegexOptions.Multiline
并在
前面的regex中添加一个
$
。细节

我想我应该说,但这两个选项都不起作用。正则表达式本身是否有问题?SingleLine只控制正则表达式的行为。元素(它是否匹配所有内容或除换行符以外的所有内容)。他不使用电话。元素,所以它不应该更改任何内容。而Multiline只是“更改了^和$的含义,以便它们分别匹配任何行的开头和结尾,而不仅仅是整个字符串的开头和结尾。”。这两个正则表达式选项似乎有很多混淆。我想我应该说,但这两个选项都不起作用。正则表达式本身是否有问题?SingleLine只控制正则表达式的行为。元素(它是否匹配所有内容或除换行符以外的所有内容)。他不使用电话。元素,所以它不应该更改任何内容。而Multiline只是“更改了^和$的含义,以便它们分别匹配任何行的开头和结尾,而不仅仅是整个字符串的开头和结尾。”。这两个正则表达式选项似乎有很多混淆。这不是真的。请参阅RegexOptions.Singleline上的文档。这不是真的。看看这是在多个平台上工作让你受益的地方。OP仍然需要使用多行标志,并在正则表达式的第一行末尾插入
$
。$是一个锚点,因此我认为这不会达到您期望的效果。
$
是一个零宽度断言;它断言,如果存在下一个字符,则该字符必须是换行符。但它不会消耗角色;您仍然必须以老式的方式执行此操作,即使用单线模式下的
\n
\s
,甚至
。在使用它的地方,下一个字符必须是
,这不是真的。请参阅RegexOptions.Singleline上的文档。这不是真的。看看这是在多个平台上工作让你受益的地方。OP仍然需要使用多行标志,并在正则表达式的第一行末尾插入
$
。$是一个锚点,因此我认为这不会达到您期望的效果。
$
是一个零宽度断言;它断言,如果存在下一个字符,则该字符必须是换行符。但它不会消耗角色;您仍然必须以老式的方式执行此操作,即使用单线模式下的
\n
\s
,甚至
。在使用它的地方,下一个字符必须是