これは重複していると確信していますが、正しい検索条件が見つかりません。
基本的に、中括弧で囲まれたキーワードを含むユーザー指定の文字列があります。キーワードを見つけるが、区切り文字の二重セットを無視する正規表現が必要です。
例: 「{{hat}} をかぶった猫は {back} をかみません。」
{back} を返すが {hat} を返さない正規表現が必要です。
これはC#用です。
これはあなたが探しているものです
(?<!\{)\{\w+\}(?!\})
これを試してみてください。これには、開き括弧と閉じ括弧を 1 つにする必要があります。二重括弧は無視されます。
[^{][{]([^}]*)[}][^}]
using System;
using System.Text.RegularExpressions;
namespace myapp
{
class Class1
{
static void Main(string[] args)
{
String sourcestring = "A cat in a {{hat}} doesn't bite {back}.";
Regex re = new Regex(@"[^{][{]([^}]*)[}][^}]");
MatchCollection mc = re.Matches(sourcestring);
int mIdx=0;
foreach (Match m in mc)
{
for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++)
{
Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames()[gIdx], m.Groups[gIdx].Value);
}
mIdx++;
}
}
}
}
$matches Array:
(
[0] => Array
(
[0] => {back}.
)
[1] => Array
(
[0] => back
)
)
答えは、使用している正規表現パーサーによって若干異なりますが、おそらく次のようなものが必要です。
(?:[^{]){([^}]*)}|{([^}]*)}(?:[^}])|^{([^}]*)}$
"{" 以外 (一致の一部ではない) の後に "{" (キャプチャ) が続き、"}" 以外のすべての文字 (キャプチャの終了) の後に "}" が続く、または...
「{」の後に「{」(キャプチャ)「}」以外のすべての文字(キャプチャの終了)の後に「}」以外(一致の一部ではない)が続く、または...
行頭の後に "{" (キャプチャ) が続き、"}" 以外のすべての文字 (キャプチャの終了) の後に行末が続きます
一部のパーサーは「?:」演算子を認識しない可能性があり、一部のパーサーは次の文字の一部またはすべて (「[]」内にない場合) をバックスラッシュでエスケープする必要があることに注意してください。
Regexヘルパーを使用しただけで、それほど難しくありません:
(?:[^{]){([^}]*)}|{([^}]*)}(?:[^}])|^{([^}]*)}$