正则表达式匹配该行的最后一个单词

时间:2012-12-13 15:58:46

标签: c# .net regex match

我有这个HTML

<br />
<strong>Name:</strong> Josef
<br />

我希望在这种情况下匹配名称“Josef”。 我有一些问题,因为如果你不使用m和正则表达式,Josef是该字符串的最后一个字。 我的方法

^<strong>Name:</strong> (.*?)$

似乎无法正常工作,如何正确完成?

6 个答案:

答案 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")。