2015-12-01 212 views
1

我有這兩個字符串:正則表達式檢索字符串中的字符串

s = t 
[ f ] s = t 

,並處理每一個使用這種模式正則表達式:

(?<=]).*(?==|:) 

我的目標是試圖獲取" s " part (between the "]" and "="),雖然"[ f ]" is optional,正如你在第一行中看到的那樣。

我已經嘗試了許多不同的模式,在網上找到並被別人使用,也花了最後2個小時試圖找出與參考,搜索引擎,試驗和錯誤,但沒有成功。

我該怎麼做到這一點?我需要什麼樣的模式才能實現這一目標?

+1

你在這裏試圖解決什麼問題?一個例子不會削減它。 – nhahtdh

+0

如果你的目標是解析ini文件,然後https://stackoverflow.com/questions/217902/reading-writing-an-ini-file – nhahtdh

回答

1

您可以使用正則表達式來完成此任務。基本上,s必須是]或開始行/字符串和=符號之間的一些文本字符串。

因此,使用

(?:^\p{Zs}*|])([^]=]*)= 

regex demo

正則表達式崩潰:

  • (?:^\p{Zs}*|]) - 非捕獲組匹配2層的替代品:
    • ^\p{Zs}* - 啓動字符串/ li NE(取決於所用RegexOptions),接着0或多個水平空白符號或...
    • ] - 字面]符號
  • ([^]=]*) - 不在](捕獲組1)0或多個符號或=
  • = - 字面=符號

C# Code

var strs = new List<string> { " [ f ] s = t", "s = t"}; 
var pattern = @"(?:^\p{Zs}*|])([^]=]*)="; 
foreach (var s in strs) 
{ 
    var match = Regex.Match(s, pattern); 
    if (match.Success) 
     Console.WriteLine(match.Groups[1].Value); 
    } 

如果你需要讓你通過Match.Value需要的值,你可以使用

@"(?<=^\p{Zs}*|])[^]=:]*(?=[=:])" 

這裏是regex demo

+0

有沒有額外的一點擺脫]和=在開始和結束,我意識到我可以在這一點子串,只是想知道。 –

+0

但是你沒有把它們放在'G​​roups [1] .Value'中。如果你需要把's'作爲'match.Value',你可以使用效率低得多的'var pattern = @「(?<=^\ p {Zs} * |])[^] =] * (==?)「;'。 –

+0

我正在使用.value,但它也得到了]和=,我不介意substringing,如果=符號是冒號還是等於? –

1

與其使用RegEx,爲什麼不使用常規的.NET方法?永遠記住正則表達式不是銀色子彈。需要幾行代碼的操作很快就會變成RegEx中令人費解的混亂。

你的情況下,可以通過下面的函數來解決:

static string GetKey(string line) 
{ 
    string result = line.Split('=')[0]; 
    if (result.IndexOf('[') < result.IndexOf(']')) // preceded by an optional group 
     result = result.Split(']')[1]; 

    return result; 
} 

通過此功能運行代碼成功地檢索每行的s

+0

你是一個答案,一個很好的,雖然我故意要保持下線由於我自己的原因最小化,所以我想使用正則表達式出於這些原因。 –

相關問題