我有这个HTML
<br />
<strong>Name:</strong> Josef
<br />
我希望在这种情况下匹配名称“Josef”。 我有一些问题,因为如果你不使用m和正则表达式,Josef是该字符串的最后一个字。 我的方法
^<strong>Name:</strong> (.*?)$
似乎无法正常工作,如何正确完成?
答案 0 :(得分:2)
如果您的HTML字符串中包含两个字面换行符,则需要将正则表达式设置为multiline mode,以便$
匹配end-of-line
以及{ {1}}。
答案 1 :(得分:0)
您应该使用html parser
代替regex
但如果你还需要它
你可以做到
<strong>Name:</strong>\s*(\w+)
答案 2 :(得分:0)
亲爱的Matthias Waldkircher,
两种解决方案:
1)使用你的表达式:
"(?:^|\n)<strong>Name:</strong> (.*?)(?:$|\r)"
2)使用其他表达式:
"</strong>\s(.*?)(?:\r|$)"
在两个解决方案中,您所需的匹配将在匹配对象match.Groups [1] .Value。
的支柱中。MetaChars使用:
(?:) // unamed/unumered group;
\n // new line;
\r // carriage return;
^ // beginning of the input;
| // or
() // numered group,
$ // end of the input.
我祝你万事如意,
此致
答案 3 :(得分:0)
您可以使用此正则表达式模式查找前缀后面的位置:
(?<=prefix)find
在你的情况下
(?<=^<strong>Name:</strong> ).*$
它会找到“约瑟夫”,你不需要使用群组。但请考虑使用Html Agility Pack进行带有html的搜索。
答案 4 :(得分:0)
如果您只是想要 Joseph ,为什么不使用RightToLeft正则表达式选项为解析器提供一个开始和结束的提示,并开始工作。该模式仍然是从左到右,它转换为:
string data =@"
<br />
<strong>Name:</strong> Josef
<br />
";
string pattern = @"\</strong\>\s+([^\r\n]+)";
// Put in | | to show no whitespace leakage.
Console.WriteLine ("|{0}|", Regex.Match(data, pattern, RegexOptions.RightToLeft).Groups[1].Value);
// Outputs
// |Josef|
答案 5 :(得分:0)
我没有使用多线模式来使锚点正常工作,而是抛弃锚点:
<strong>Name:</strong>\s*([^\r\n<]+)
HTML不是基于行的格式,因此在其中使用行锚是没有意义的。这篇文章今天可能就已经出现了,但明天它可以编辑并删除新行;它仍然是有效的HTML,它仍然会呈现完全相同的。
另一个潜在的问题是新行可能是\r\n
(回车+换行)而不仅仅是\n
。 .NET正则表达式风格无法将\r
识别为行分隔符(部分),因此$
将匹配\r
和\n
之间的位置,并且\r
将与名称一起被捕获(即"Josef\r"
)。