2015-03-03 12 views
1

我有一個包含以下形式的衆多標籤的字符串:發現使用C#的子串與一捻

<: Entity.FieldGroup.FieldName [| Modifier] :> 

我需要找到標籤並與一些值(S)取代它們。所以,比如我有可能如下文如下:

Blah <: Person.Meta.Age :> blah <:  PERSON.meTA.Dependants | CommaList :> 

當等取代的樣子:

Blah 30 blah Harry, Mary, John 

現在的問題是:

  • 可能有不同數量的打開和關閉標記之前和之後的空格(<和:>)
  • 事情可能以不同的情況輸入人與人,Meta v s me
  • 我不能「影響」標籤周圍的文本
  • 沒有預定義的標籤名稱列表,即。明天可能會帶Animal.Kind例如

所以從性能的角度來看,這裏提取標籤的最佳方法是什麼,以便我可以替換它們?

我擔心,因爲我將標籤替換爲更改的字符串長度,因此任何偏移都不起作用,等等。有關如何實現上述優雅的任何建議?

+0

你能舉出一個清晰的例子,而不只是說明規則 – chouaib 2015-03-03 02:09:00

+0

我建議[Regex.Replace'的這種重載](https://msdn.microsoft.com/zh-cn/library/ms149475.aspx) – Blorgbeard 2015-03-03 02:15:31

+4

這看起來很像一種標記語言...這是一種標記語言解析器的自然解決方案。這似乎過於寬泛,不能成爲一個明智的問題 - 例如有很多標記語言解析器可供學習。否則,您提供的規則就不足以描述任何人提供有用答案的語法。即使他們這樣做,這聽起來太像是「做我的工作」類型的問題。正則表達式*可能工作,但它可能是錯誤的解決方案。看起來像一個聰明的人的工作,誰決定嘗試重寫XML而不是僅僅使用標準的東西... – 2015-03-03 02:23:53

回答

1

以下是一種獲取您要求的令牌的方法,以便您可以進行更換。

的.NET小提琴是在這裏:https://dotnetfiddle.net/6bX0Db

首先,這是一個使用正則表達式來識別匹配的令牌的方法:

public Token[] GetTokens(string input) 
{ 
    string pattern = @"<:[\W]*[\w\d]+\.[\w\d]+\.[\w\d]+[\W]*(|[\W]*[\w\d]+)?[\W]*:>"; 
    var tokens = Regex.Matches(input, pattern) 
     .OfType<Match>() 
     .Select(m => new Token(m.Value)) 
     .ToArray(); 
    return tokens; 
} 

然後,我創建了一個Token對象解析匹配的標籤進入實體字段和修飾符(如果提供)。

public class Token 
{ 
    public string TokenToReplace { get; set; } 
    public string EntityField { get; set; } 
    public string Modifier { get; set; } 
    public Token(string tag) 
    { 
     this.TokenToReplace = tag; 
     this.EntityField = Regex.Match(tag, @"[\w\d]+\.[\w\d]+\.[\w\d]+").Value; 
     this.Modifier = tag.Contains("|") ? Regex.Match(tag.Split('|').Last(), @"[\w\d]+").Value : null; 
    } 
} 

這產生輸出我的:

Field: Person.Meta.Age, Modifier: , Orig: <: Person.Meta.Age :> 
Field: PERSON.meTA.Dependants, Modifier: CommaList, Orig: <:  PERSON.meTA.Dependants | CommaList :> 

從這裏,你必須匹配與實體領域和隔離修飾標記的數組。使用基本策略或代理模式,您應該能夠將您的現有替換邏輯與可以替換的修改器和令牌一起應用。我只是用TokenToReplace值的直接String.Replace與修改器/標記替換邏輯的輸出迭代。

+0

這是真棒,很好地工作!如果可能的話,我可以做一些小修改嗎?也就是說,我可以輸入多個用分號分隔的修飾符,例如「CommaList; Modifier2; Modifier3」。我認爲這是一個答案,因爲我意識到我在尋求額外的功能。 – TheEdge 2015-03-03 03:19:59

+1

這是一個.NET小提琴與新的需求(https://dotnetfiddle.net/tQJCdE)。我改變了與修飾符匹配的正則表達式,在分號的前面和後面包含分號和空格,因爲您提到這是用戶輸入的。我還修改了Token對象和構造函數,以便將修飾符保存爲字符串數組而不僅僅是一個字符串 – 2015-03-03 04:33:34

+0

這也是一種魅力......我欠你一杯啤酒或少數;-) – TheEdge 2015-03-06 04:27:17