2016-02-01 47 views
0

我試圖在Xamarin窗體中顯示格式化的標籤(不要緊,如果你不熟悉,問題不依賴於此)。給定一個字符串可以包含任何字符和<b> </b >標記,我需要創建FormattedString對象,其中包含文本的跨度。例如C#正則表達式與Xamarin的HTML標籤FormattedString

Lorem ipsum dolor sit amet, consectetur &lt;b&gt;adipiscing elit&lt;/b&gt;. Integer imperdiet massa accumsan turpis ullamcorper tempor. &lt;b&gt;Cras eget erat quis mi sollicitudin vehicula.&lt;/b&gt; Sed ac risus mattis. 

此文本應該被轉化成這些跨度

  1. Lorem存有悲坐阿梅德,consectetur

  2. adipiscing ELIT

  3. 。 Integer非侵入性massa accumsan turpis ullamcorper tempor。

  4. Cras eget erat quis mi sollicitudin vehicula。

  5. Sed ac risus mattis。

我使用下面的正則表達式

private static Regex _formatterRegex = new Regex(@"(?<text>[^<>\\/]+)|(?<bold><b>(?<boldBody>[^<>\\/]*)<\\/b>)"); 

所以我要麼匹配b <一些> TEXT </B >或任意文本。這裏的問題是'b'<b> </b >標籤也匹配。看看進入比賽

enter image description here

我需要以某種方式只有當它不是內任意文本匹配<b> </B >標籤,所以我的比賽集合將不包含HTML標籤的B-S。有任何想法嗎?

+0

使用HTML解析器 –

+0

你能不能給我一個鏈接?我也不想使用整個HTML解析庫來解析一個標籤。無論如何,我想用正則表達式解決這個問題,所以我需要一個正則表達式解決方案。 – kyurkchyan

+1

我建議閱讀關於[*最偉大的正則表達技巧*](http://www.rexegg.com/regex-best-trick.html#allbutx)。 –

回答

0

以下是我想接近它:

var text = "Lorem ipsum dolor sit amet, consectetur &lt;b&gt;adipiscing elit&lt;/b&gt;. Integer imperdiet massa accumsan turpis ullamcorper tempor. &lt;b&gt;Cras eget erat quis mi sollicitudin vehicula.&lt;/b&gt; Sed ac risus mattis."; 

var regex = new Regex("(?<text>.+?)(?:&.*?;.*?;|$)"); 

var matches = regex.Matches(text); 

foreach(Match m in matches){ 
    Console.WriteLine("|" + m.Groups["text"].Value.Trim() + "|"); 
} 

產地:

|Lorem ipsum dolor sit amet, consectetur| 
|adipiscing elit| 
|. Integer imperdiet massa accumsan turpis ullamcorper tempor.| 
|Cras eget erat quis mi sollicitudin vehicula.| 
|Sed ac risus mattis.|