コード例 #1
0
ファイル: IcuRegexEngine.cs プロジェクト: Viorel/RegExpress
        public string[] ExportOptions( )
        {
            IcuRegexOptions options = OptionsControl.GetSelectedOptions( );
            var             json    = JsonSerializer.Serialize(options);

            return(new[] { $"json:{json}" });
        }
コード例 #2
0
ファイル: IcuRegexEngine.cs プロジェクト: Viorel/RegExpress
        Regex CreateHighlightingRegex(IcuRegexOptions options)
        {
            var pb = new PatternBuilder( );

            pb.Add(@"\(\?\#.*?(\)|$)");               // comment

            if (options.UREGEX_COMMENTS)
            {
                pb.Add(@"\#.*?(\n|$)");                            // line-comment
            }
            pb.Add(@"\\Q.*?(\\E|$)");                              // quoted part

            pb.Add(@"(?'left_par'\()");                            // '('
            pb.Add(@"(?'right_par'\))");                           // ')'
            pb.Add(@"\\[NpPx]\{.*?(\}|$)");                        // (skip)
            pb.Add(@"(?'left_brace'\{).*?((?'right_brace'\})|$)"); // '{...}'

            string posix_bracket = @"(\[:.*?(:\]|$))";             // [:...:]

            pb.Add($@"
						(?'left_bracket'\[)
						\]?
						(?> {posix_bracket} | (?'left_bracket'\[)(?<c>) | (\\. | [^\[\]])+ | (?'right_bracket'\])(?<-c>))*
						(?(c)(?!))
						(?'right_bracket'\])?
						|
						(?'right_bracket'\])
						"                        );

            pb.Add(@"\\.");               // '\...'

            return(pb.ToRegex( ));
        }
コード例 #3
0
ファイル: IcuRegexEngine.cs プロジェクト: Viorel/RegExpress
        Regex GetCachedHighlightingRegex( )
        {
            IcuRegexOptions options = OptionsControl.GetSelectedOptions( );

            if (options.UREGEX_LITERAL)
            {
                return(PatternBuilder.AlwaysFailsRegex);
            }

            object key = options.UREGEX_COMMENTS;

            lock ( CachedHighlightingRegexes )
            {
                if (CachedHighlightingRegexes.TryGetValue(key, out Regex regex))
                {
                    return(regex);
                }

                regex = CreateHighlightingRegex(options);

                CachedHighlightingRegexes.Add(key, regex);

                return(regex);
            }
        }
コード例 #4
0
        public IcuMatcher(string pattern, IcuRegexOptions options)
        {
            Options = options;

            if (!string.IsNullOrWhiteSpace(options.Limit) && !int.TryParse(options.Limit, out var limit))
            {
                throw new ApplicationException("Invalid limit. Please enter an integer number.");
            }

            Pattern = pattern;
        }
コード例 #5
0
        internal void SetSelectedOptions(IcuRegexOptions options)
        {
            try
            {
                ++ChangeCounter;

                Options     = options.Clone( );
                DataContext = Options;
            }
            finally
            {
                --ChangeCounter;
            }
        }
コード例 #6
0
ファイル: IcuRegexEngine.cs プロジェクト: Viorel/RegExpress
        public void ImportOptions(string[] options)
        {
            var json = options.FirstOrDefault(o => o.StartsWith("json:"))?.Substring("json:".Length);

            IcuRegexOptions options_obj;

            if (string.IsNullOrWhiteSpace(json))
            {
                options_obj = new IcuRegexOptions( );
            }
            else
            {
                options_obj = JsonSerializer.Deserialize <IcuRegexOptions>(json);
            }

            OptionsControl.SetSelectedOptions(options_obj);
        }
コード例 #7
0
ファイル: IcuRegexEngine.cs プロジェクト: Viorel/RegExpress
        Regex CreateColouringRegex(IcuRegexOptions options)
        {
            var pb_escape = new PatternBuilder( );

            pb_escape.BeginGroup("escape");
            pb_escape.Add(@"\\c[A-Za-z]");             // \cx control char
            pb_escape.Add(@"\\[NpP]\{.*?(\} | $)");    // named character, property
            pb_escape.Add(@"\\[uUx][0-9a-fA-F]+");     // hexadecimal char
            pb_escape.Add(@"\\x\{[0-9a-fA-F]+(\}|$)"); // hexadecimal char
            pb_escape.Add(@"\\0[0-7]+");               // octal
            pb_escape.Add(@"\\Q.*?(\\E|$)");           // quoted part
            pb_escape.Add(@"\\.");                     // \.
            pb_escape.EndGroup( );

            var pb = new PatternBuilder( );

            pb.BeginGroup("comment");
            pb.Add(@"\(\?\#.*?(\)|$)");               // comment
            if (options.UREGEX_COMMENTS)
            {
                pb.Add(@"\#.*?(\n|$)");                                         // line-comment
            }
            pb.EndGroup( );

            pb.Add(@"\(\?(?'name'<(?![=!]).*?(>|$))");
            pb.Add(@"(?'name'\\k<.*?(>|$))");

            string posix_bracket = @"(?'escape'\[:.*?(:\]|$))";             // [:...:], use escape colour

            pb.Add($@"
						\[
						\]?
						(?> {posix_bracket} | \[(?<c>) | ({pb_escape.ToPattern( )} | [^\[\]])+ | \](?<-c>))*
						(?(c)(?!))
						\]
						"                        );

            pb.Add(pb_escape.ToPattern( ));

            return(pb.ToRegex( ));
        }
コード例 #8
0
ファイル: IcuRegexEngine.cs プロジェクト: Viorel/RegExpress
        public IMatcher ParsePattern(string pattern)
        {
            IcuRegexOptions options = OptionsControl.GetSelectedOptions( );

            return(new IcuMatcher(pattern, options));
        }