我有这个 HTML
<br />
<strong>Name:</strong> Josef
<br />
在这种情况下,我想匹配名称“Josef”。我有一些问题,因为如果您不将 m 与正则表达式一起使用,Josef 是该字符串的最后一个单词。我的方法
^<strong>Name:</strong> (.*?)$
似乎不起作用,这是如何正确完成的?
如果您的 HTML 字符串像看起来那样有两个文字换行符,您需要将您的正则表达式设置为多行模式,以便$
匹配.end-of-line
end-of-string
你应该使用html parser
而不是regex
但如果你还需要它
你可以做
<strong>Name:</strong>\s*(\w+)
亲爱的马蒂亚斯·瓦尔德基歇尔,
两种解决方案:
1)使用你的表达:
"(?:^|\n)<strong>Name:</strong> (.*?)(?:$|\r)"
2) 用其他表达方式:
"</strong>\s(.*?)(?:\r|$)"
在这两种解决方案中,您想要的匹配都将是匹配对象 match.Groups[1].Value 的这个道具中的一个。
使用的元字符:
(?:) // unamed/unumered group;
\n // new line;
\r // carriage return;
^ // beginning of the input;
| // or
() // numered group,
$ // end of the input.
我希望你是最好的,
真挚地,
您可以使用此正则表达式模式来查找前缀后面的位置:
(?<=prefix)find
在你的情况下
(?<=^<strong>Name:</strong> ).*$
它会准确找到“Josef”,您不需要使用组。但请考虑使用Html Agility Pack进行 html 搜索。
如果您只想要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|
我不会使用多行模式来使锚点正常工作,而是放弃锚点:
<strong>Name:</strong>\s*([^\r\n<]+)
HTML 不是基于行的格式,因此在其中使用行锚没有任何意义。这段文字今天可能在自己的行中,但明天可能会被编辑并删除换行符;它仍然是有效的 HTML,并且仍将呈现完全相同的内容。
另一个潜在问题是换行符可能是\r\n
(carriage-return + linefeed) 而不仅仅是\n
. .NET 正则表达式风格不识别\r
为(部分)行分隔符,因此$
将匹配 the\r
和 the之间的位置\n
,并且\r
将与名称( ie )一起捕获"Josef\r"
。