为什么我的C#正则表达式行间不匹配?
我在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</
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
,甚至
。在使用它的地方,下一个字符必须是