2012-12-13 55 views
1

我有這樣的HTML正則表達式匹配的行

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

我想的名字,「約瑟夫」,在這種情況下,比賽的最後一個字。 我有一些問題,因爲約瑟夫是該字符串的最後一個字,如果你不使用m和正則表達式。 我的方法

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

似乎沒有工作,這是如何正確完成的?

+0

你的HTML的所有三行都在單個'string'變量中嗎? '
'標籤之前/之後是否有文字換行符? – Rawling

+1

你可以告訴我們更多的'html'..'regex'不推薦用於解析'html' ..你的'擴展html'我們可以建議你一些其他的解決方法.. html是不夠的.. – Anirudha

回答

2

如果你的HTML字符串有兩個文本換行,就象一個作爲它似乎,你需要設置你的正則表達式爲multiline mode,這樣$匹配end-of-line以及end-of-string

0

您應該使用的html parser代替regex


但是,如果你仍然需要它

你可以做

<strong>Name:</strong>\s*(\w+) 
+0

Singleline在這裏沒有任何改變。它隻影響'.'的行爲。 –

+0

同意如果我做多個操作,但它只是這一個操作,我不想加載HTMLAgilityPack的原因。 – maddo7

+0

@ m.buettner thx for that..edited the ans – Anirudha

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. 

我想你最好的,

真誠,

0

你可以用它找到一個位置以下的前綴這個正則表達式:

(?<=prefix)find 

在你的情況下

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

它會找到確切的「約瑟夫」,你將不需要使用組。但考慮使用HTML來搜索Html Agility Pack

0

如果你只想約瑟夫爲什麼不使用RightToLeft正則表達式選項給解析器一個提示開始和結束,並開始工作。該模式仍然是從左向右,並將其轉換到這一點:

string data [email protected]" 
<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| 
0

而不是使用多模式,使其錨工作的權利,我想溝錨:

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

HTML是不是基於行的格式,因此在其中使用行錨並沒有意義。這段文字今天可能會在自己的路線上,但明天它可以被編輯並刪除換行符;它仍然是有效的HTML,它仍然會呈現完全相同。

另一個潛在的問題是換行符可能是\r\n(回車+換行符)而不是\n。 .NET正則表達式不會將\r識別爲行分隔符(的一部分),因此$將匹配\r\n之間的位置,並且\r將與名稱(即"Josef\r")一起被捕獲。