1

私はこのコードを見ていますが、この関数を使用してすべての正規表現をフォーマットしています:

string.Format("(?-mix:{0})", regex);

とは(?-mix:{0})どういう意味ですか? (私{0}はプレースホルダーであることを知っています)。

コードは次のとおりです。

https://github.com/formosatek/dotliquid/blob/master/src/DotLiquid/Liquid.cs#L36 https://github.com/formosatek/dotliquid/blob/master/src/DotLiquid/Util/R.cs #L12

public static string Q(string regex)
        {
            return string.Format("(?-mix:{0})", regex);
        }


public static class Liquid
    {
        internal static readonly ResourceManager ResourceManager = new ResourceManager(typeof(DotLiquid.Properties.Resources));

        public static readonly string FilterSeparator = R.Q(@"\|");
        public static readonly string ArgumentSeparator = R.Q(@",");
        public static readonly string FilterArgumentSeparator = R.Q(@":");
        public static readonly string VariableAttributeSeparator = R.Q(@".");
        public static readonly string TagStart = R.Q(@"\{\%");
        public static readonly string TagEnd = R.Q(@"\%\}");
        public static readonly string VariableSignature = R.Q(@"\(?[\w\-\.\[\]]\)?");
        public static readonly string VariableSegment = R.Q(@"[\w\-]");
        public static readonly string VariableStart = R.Q(@"\{\{");
        public static readonly string VariableEnd = R.Q(@"\}\}");
        public static readonly string VariableIncompleteEnd = R.Q(@"\}\}?");
        public static readonly string QuotedString = R.Q(@"""[^""]*""|'[^']*'");
        public static readonly string QuotedFragment = string.Format(R.Q(@"{0}|(?:[^\s,\|'""]|{0})+"), QuotedString);
        public static readonly string QuotedAssignFragment = string.Format(R.Q(@"{0}|(?:[^\s\|'""]|{0})+"), QuotedString);
        public static readonly string StrictQuotedFragment = R.Q(@"""[^""]+""|'[^']+'|[^\s\|\:\,]+");
        public static readonly string FirstFilterArgument = string.Format(R.Q(@"{0}(?:{1})"), FilterArgumentSeparator, StrictQuotedFragment);
        public static readonly string OtherFilterArgument = string.Format(R.Q(@"{0}(?:{1})"), ArgumentSeparator, StrictQuotedFragment);
        public static readonly string SpacelessFilter = string.Format(R.Q(@"^(?:'[^']+'|""[^""]+""|[^'""])*{0}(?:{1})(?:{2}(?:{3})*)?"), FilterSeparator, StrictQuotedFragment, FirstFilterArgument, OtherFilterArgument);
        public static readonly string Expression = string.Format(R.Q(@"(?:{0}(?:{1})*)"), QuotedFragment, SpacelessFilter);
        public static readonly string TagAttributes = string.Format(R.Q(@"(\w+)\s*\:\s*({0})"), QuotedFragment);
        public static readonly string AnyStartingTag = R.Q(@"\{\{|\{\%");
        public static readonly string PartialTemplateParser = string.Format(R.Q(@"{0}.*?{1}|{2}.*?{3}"), TagStart, TagEnd, VariableStart, VariableIncompleteEnd);
        public static readonly string TemplateParser = string.Format(R.Q(@"({0}|{1})"), PartialTemplateParser, AnyStartingTag);
        public static readonly string VariableParser = string.Format(R.Q(@"\[[^\]]+\]|{0}+\??"), VariableSegment);
        public static readonly string LiteralShorthand = R.Q(@"^(?:\{\{\{\s?)(.*?)(?:\s*\}\}\})$");
        public static readonly string CommentShorthand = R.Q(@"^(?:\{\s?\#\s?)(.*?)(?:\s*\#\s?\})$");
4

2 に答える 2

5

これは正規表現ではありません。これは への呼び出しであるため、フォーマット文字列ですstring.Format

これは単純に文字列をフォーマットし、regex変数の値 (または変数を呼び出した結果ToString()) を{0}.

結果は string"(?-mix:<whatever regex.ToString() is>)"です。

この文字列は正規表現のように見え、いくつかの修飾子をオフにします (したがって、これは大文字と小文字が区別され、^ と $ は行頭と行末のみに一致し、フリー スペーシング モードはオフになります)。www.regular-expressions.infoの正規表現の高度な構文リファレンスを参照してください

したがって、上記はregexこれらのオプションをオフにすると一致します。

于 2012-10-11T15:16:21.670 に答える
1

さて、少し遅れましたが、意味がわからなかった場合に備えて:

(正規表現は、との間のキャプチャ グループを定義し)ます。グループ化が必要だが、キャプチャは必要ない場合は、 と の間に式を記述し(?:ます)。また、一部の正規表現プロセッサは、非キャプチャ グループ?との間のオン/オフ フラグを受け入れます。:そのため、「ミキシング」が行われます。これは、実際には、記号で区切られたグループに関するいくつかのフラグをオフにすることを意味します-(フラグをオフにします):

  • m modifier off: -複数行、^ および $ は、行頭/行末だけでなく一致します
  • i modifier off: -大文字と小文字を区別しない一致
  • x modifier off: -拡張、パターン内の空白は文字どおりの空白です

だから、それらをオフにすると(?-mix:...になります。...または他の順序でも)同じです。(?-ixm:)

とにかく、.NET の Regex クラスはこれらのフラグを気にしないと思います。後で確認してください。これは、液体エンジンの元の ruby​​ ソースから移行されています。

于 2015-02-15T16:06:25.560 に答える