1

我有这个 HTML

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

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

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

似乎不起作用,这是如何正确完成的?

4

6 回答 6

2

如果您的 HTML 字符串像看起来那样有两个文字换行符,您需要将您的正则表达式设置为多行模式,以便$匹配.end-of-lineend-of-string

于 2012-12-13T16:13:59.677 回答
0

你应该使用html parser而不是regex


但如果你还需要它

你可以做

<strong>Name:</strong>\s*(\w+)
于 2012-12-13T16:01:35.810 回答
0

亲爱的马蒂亚斯·瓦尔德基歇尔,

两种解决方案:

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.

我希望你是最好的,

真挚地,

于 2012-12-13T20:47:28.340 回答
0

您可以使用此正则表达式模式来查找前缀后面的位置:

(?<=prefix)find

在你的情况下

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

它会准确找到“Josef”,您不需要使用组。但请考虑使用Html Agility Pack进行 html 搜索。

于 2012-12-13T22:03:29.637 回答
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|
于 2012-12-13T22:07:23.297 回答
0

我不会使用多行模式来使锚点正常工作,而是放弃锚点:

<strong>Name:</strong>\s*([^\r\n<]+)

HTML 不是基于行的格式,因此在其中使用行锚没有任何意义。这段文字今天可能在自己的行中,但明天可能会被编辑并删除换行符;它仍然是有效的 HTML,并且仍将呈现完全相同的内容。

另一个潜在问题是换行符可能是\r\n(carriage-return + linefeed) 而不仅仅是\n. .NET 正则表达式风格不识别\r为(部分)行分隔符,因此$将匹配 the\r和 the之间的位置\n,并且\r将与名称( ie )一起捕获"Josef\r"

于 2012-12-13T22:47:27.260 回答