2010-11-25 10 views
12

、私は非常に大きな文字列(HTML)を持っており、このHTMLにそれらのすべてが「#」で始まり、「#」文字列内の特定のトークンを検出します。 C#

簡単な例:私は必要

<html> 
<body> 
     <p>Hi #Name#, You should come and see this #PLACE# - From #SenderName#</p> 
</body> 
</html> 

で終わる特定のトークンが存在しますこれらのトークンを検出してリストに入れるコード。 0 - #名前# 1 - #プレース# 2 - #1 SENDERNAMEの#

私は多分、正規表現を使用することができることを知っているが、いずれにせよ、あなたがそれを行うにはいくつかのアイデアを持っていますか?

答えて

8

string test = "Hi #Name#, You should come and see this #PLACE# - From #SenderName#"; 
Regex reg = new Regex(@"#\w+#"); 
foreach (Match match in reg.Matches(test)) 
{ 
    Console.WriteLine(match.Value); 
} 

\ wは、任意の英数字を表します。 +は、1回以上出現する可能性があることを示します。ここで詳しい情報を見つけることができます。msdn doc(.Net 4.の場合は、他のバージョンもあります)。

2

用途:

MatchCollection matches = Regex.Matches(mytext, @"#(\w+)#"); 

foreach(Match m in matches) 
{ 
    Console.WriteLine(m.Groups[1].Value); 
} 
+0

regexを@ "#(。*)#"に変更すると動作するはずです – T33C

3
foreach (Match m in Regex.Matches(input, @"#\w+#")) 
    Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index); 
+0

これはどのように '##より多くの文字を置きますか?これは単一の単語である限り、ハッシュの「外側」の単語を解析しませんか?それとも私はここで間違っていますか? –

+0

あなたの例では "#Name#"と "#PLACE#"と表示されます。複数のマッチが考慮されると、それぞれのマッチは前のものが終了した後に開始します。つまり、 "#Name#"がマッチした後、2番目のハッシュ記号の次のマッチを探し始めます。 – VladV

+0

+1:それは完璧です。 #は実際には最初のマッチで "使用"されているため、今度は#が使用されているため、2番目のマッチでは使用できません。 enlightmentありがとう。 –

10

あなたは試すことができます:this SO質問に触発

// using System.Text.RegularExpressions; 
// pattern = any number of arbitrary characters between #. 
var pattern = @"#(.*?)#"; 
var matches = Regex.Matches(htmlString, pattern); 

foreach (Match m in matches) { 
    Console.WriteLine(m.Groups[1]); 
} 

回答。 Regexなし

+2

+1はい - 欲張りではない*試合も考慮します。それはすべきだが。 –

+2

これは、次のようなテキストを解析できません: 'Hi#Name#where#PLACE#more text'、またはRegExの動作に関する何かを誤解させてください。それはOPにとっても有効な問題ではないかもしれないので、それは私の好奇心のためのものです:) –

+0

はい。私は 'Hi#Name#where#PLACE#more text'で失敗すると思います。 –

4

バリアントあなたが好きなら:

var splitstring = myHtmlString.Split('#'); 
var tokens = new List<string>(); 
for(int i = 1; i < splitstring.Length; i+=2){ 
    tokens.Add(splitstring[i]); 
} 
+0

なぜこれにdownvote?それは必要な結果をもたらすでしょう。私はdownvoterからの理由を感謝します。 –

+1

それは動作します、私は+1正規表現をあまり愛している人を補うためにそれを与えるでしょう。 – tim

+0

@tim - he..he ..ありがとう;) –

0

は、パターンのため

#[^#]+#のようなもののパターンでRegex.Matchesメソッドを使用します。

おそらく最も素朴な方法です。このため

(?<=#)[^#]+(?=#)

(試合値は以下のようになり ':あなたはおそらく前後参照して、出力の試合に「#」文字を含む避けたい場合

これはその後、調整する必要があります「は 『#こんにちは#』こんにちは - あなたは任意のより多くのトリミングを行う必要はありません)

0

要求されたので、これはあなたのトークンのリストを与える:

var tokens = new List<string>(); 
var matches = new Regex("(#.*?#)").Matches(html); 

foreach (Match m in matches) 
    tokens.Add(m.Groups[1].Value); 

編集:はちょうど(パブロの回答を参照してください)正規表現文字列の括弧の外にそれらを移動、ポンド文字が含まれたくないあなたがない場合。

2

ナイーブソリューション:

LINE1 - 私たちは文字 '#'

LINE2でテキストを分割する - 私たちは選択します。

var result = Regex 
    .Matches(html, @"\#([^\#.]*)\#") 
    .OfType<Match>() 
    .Select(x => x.Groups[1].Value) 
    .ToList(); 
2

この

var result = html.Split('#') 
        .Select((s, i) => new {s, i}) 
        .Where(p => p.i%2 == 1) 
        .Select(t => t.s); 

説明をしてみてください配列内の文字列の位置と文字列自体を含む新しい匿名型

line3 - 奇数のインデックス値を持つ文字列に匿名オブジェクトのリストをフィルタリングする - 効果的に 'その他すべての文字列を選択する' - これは、

以外の文字列ではなく、ハッシュ文字で囲まれた文字列を見つけるのに適しています。

LINE4 =私たちは、インデクサを取り去り、そして匿名型

+0

+1は、私がすべて知っていると思う値に加えて、あなたにインデックスを与える 'Select'オーバーロードを使用しています。 –

+0

素敵で短いですが、もう少し説明してもらえますか? s、私、p?おそらく "説明する"変数を使用すると、他の人にもっと教育的になるでしょう。 – BerggreenDK

+1

説明を追加 –

1

LINQの溶液から単なる文字列を返す:はいあなたは正規表現を使用することができます

 string s = @"<p>Hi #Name#, 
      You should come and see this #PLACE# - From #SenderName#</p>"; 

     var result = s.Split('#').Where((x, y) => y % 2 != 0).Select(x => x); 
+0

素敵で短いですが、もう少し説明してもらえますか? x、y?おそらく "説明する"変数を使用すると、他の人にもっと教育的になるでしょう。 – BerggreenDK

+0

@BerggreenDKもちろん、 'Where'メソッドはオーバーロードされています。 '(x、y)'はペアであり、 'x'はコレクションの現在のアイテムであり、' y'はこのアイテムのインデックスです。はい、あなたの権利は、わかりやすくするために 'Where(item、index) 'を使っていました。私は奇妙な文字列を選択した後、私たちが必要なものだからです。 – nan

関連する問題