{key-value}Some text{/key}
次の形式のテキスト領域内に0個または多数のサブストリングを含めることができます。
例えばThis is my {link-123}test{/link} text area
このパターンに一致するアイテムを繰り返し処理し、キーと値に基づいて実行してアクションを実行してから、このサブ文字列を新しい文字列(キーに基づくアクションによって取得されるアンカーリンク)に置き換えます。
C#でこれをどのように達成しますか?
これらのタグがネストされていない場合は、ファイルに対して1回だけ繰り返す必要があります。ネスティングが可能な場合は、ネスティングのレベルごとに1回の反復を行う必要があります。
この回答は、中括弧がタグ区切り文字としてのみ発生することを前提としています(たとえば、コメント内では発生しません)。
result = Regex.Replace(subject,
@"\{ # opening brace
(?<key>\w+) # Match the key (alnum), capture into the group 'key'
- # dash
(?<value>\w+) # Match the value (alnum), capture it as above
\} # closing brace
(?<content> # Match and capture into the group 'content':
(?: # Match...
(?!\{/?\k<key>) # (unless there's an opening or closing tag
. # of the same name right here) any character
)* # any number of times
) # End of capturing group
\{/\k<key>\} # Match the closing tag.",
new MatchEvaluator(ComputeReplacement), RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
public String ComputeReplacement(Match m) {
// You can vary the replacement text for each match on-the-fly
// m.Groups["key"].Value will contain the key
// m.Groups["value"].Value will contain the value of the match
// m.Groups["value"].Value will contain the content between the tags
return ""; // change this to return the string you generated here
}
このようなもの?
Regex.Replace(text,
"[{](?<key>[^-]+)-(?<value>[^}])[}](?<content>.*?)[{][/]\k<key>[}]",
match => {
var key = match.Groups["key"].Value;
var value= match.Groups["value"].Value;
var content = match.Groups["content"].Value;
return string.format("The content of {0}-{1} is {2}", key, value, content);
});
.net正規表現ライブラリを使用します。これは、Matchesメソッドを使用する例です。
http://www.dotnetperls.com/regex-matches
テキストを置き換えるには、Antlrなどのテンプレートエンジンの使用を検討してください
http://www.antlr.org/wiki/display/ANTLR3/Antlr+3+CSharp+Target
これがMatchesブログの例です
システムを使用する; System.Text.RegularExpressionsを使用します。
class Program
{
static void Main()
{
// Input string.
const string value = @"said shed see spear spread super";
// Get a collection of matches.
MatchCollection matches = Regex.Matches(value, @"s\w+d");
// Use foreach loop.
foreach (Match match in matches)
{
foreach (Capture capture in match.Captures)
{
Console.WriteLine("Index={0}, Value={1}", capture.Index, capture.Value);
}
}
}
}
C#正規表現構文の詳細については、次のチートシートを使用できます。
http://www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet