public RegexParser(Action <RegexExpression> parseCallback = null, bool ignorePatternWhitespace = true, bool breakOnSlash = false) { this.IgnorePatternWhitespace = ignorePatternWhitespace; this.BreakOnSlash = breakOnSlash; this.parseCallback = parseCallback; this.currentGroup = new RegexGroup(null); }
public RegexGroup(RegexGroup parent, bool?caseSensitive = null) { this.parent = parent; this.caseSensitive = caseSensitive; this.current = RegexNoOp.Default; this.pending = null; }
public static string GetRegexValue(this string line, RegexKey regexKey, RegexGroup regexGroup) { string result = ""; string replaceLine = ""; var patterns = new RegexPatterns(); var keys = patterns.GetValue(regexKey); if (line != null) { replaceLine = Regex.Replace(line, keys.OriginalKey, keys.ReplaceKey); var match = Regex.Match(replaceLine, keys.RegexSearchKey); result = match.Groups[(int)regexGroup].Value; } return(result); }
internal AddressTruncator(AOTypeDictionary typeDictionary) { this.typeDictionary = typeDictionary; sb = new StringBuilder(); houseTypesMultiPattern = typeDictionary.GetRegexMultiPattern((int)ObjectLevel.House); roomTypesMultiPattern = typeDictionary.GetRegexMultiPattern((int)ObjectLevel.Room); regionTypesMultiPattern = typeDictionary.GetRegexMultiPattern((int)ObjectLevel.Region, GenderNoun.Fiminine); streetTypesMultiPattern = typeDictionary.GetRegexMultiPattern((int)ObjectLevel.Street); fullHouseTypesPattern = String.Format(typeAndNumber, houseTypesMultiPattern); fullRoomTypesPattern = String.Format(typeAndNumber, roomTypesMultiPattern); regionPattern = String.Format("^[^ ]+ая +{0}(?=[^а-я]+?)", regionTypesMultiPattern); allTypesMultiPattern = String.Format(@"(?<=[^а-я]|^){0}(\.+?|(?=[^а-я]|$))", typeDictionary.GetRegexMultiPattern()); housePredictPattern = String.Format("(?<=([^а-я]|^){0}[^а-я]*)[0-9]+([^а-я]*)([а-я](?=[^а-я]|$))*", streetTypesMultiPattern) + litterPattern; regexGroup = new RegexGroup(RegexOptions.Compiled | RegexOptions.IgnoreCase); }
private void ProcessTerminal(SymbolId symbol, Capture <char> capture) { switch ((int)symbol) { case RegexLexer.SymWhitespace: if (!this.IgnorePatternWhitespace) { foreach (var ch in capture) { this.currentGroup.AppendExpression(RegexMatchSet.FromChars(ch)); } } break; case RegexLexer.SymSlash: if (this.BreakOnSlash) { goto case int.MinValue; // EOF } this.currentGroup.AppendExpression(RegexMatchSet.FromCodepoints('/')); break; case RegexLexer.SymCharset: this.currentGroup.AppendExpression(RegexMatchSet.FromNamedCharset(capture.AsString())); break; case RegexLexer.SymRegexLetter: this.currentGroup.AppendExpression(RegexMatchGrapheme.Create(capture.AsString())); break; case RegexLexer.SymRegexEscape: this.currentGroup.AppendExpression(RegexMatchSet.FromEscape(capture.AsString())); break; case RegexLexer.SymRegexCharset: this.currentGroup.AppendExpression(RegexMatchSet.FromSet(capture.AsString())); break; case RegexLexer.SymRegexDot: this.currentGroup.AppendExpression(RegexMatchSet.Dot()); break; case RegexLexer.SymQuantifyKleene: this.currentGroup.Quantify(RegexQuantifier.Kleene()); break; case RegexLexer.SymQuantifyAny: this.currentGroup.Quantify(RegexQuantifier.Any()); break; case RegexLexer.SymQuantifyOptional: this.currentGroup.Quantify(RegexQuantifier.Optional()); break; case RegexLexer.SymQuantifyRepeat: this.currentGroup.Quantify(RegexQuantifier.Repeat(capture.AsString())); break; case RegexLexer.SymAlternate: this.currentGroup.Alternate(); break; case RegexLexer.SymBeginGroup: this.currentGroup = this.currentGroup.BeginGroup(null); break; case RegexLexer.SymSensitiveGroup: this.currentGroup = this.currentGroup.BeginGroup(true); break; case RegexLexer.SymInsensitiveGroup: this.currentGroup = this.currentGroup.BeginGroup(false); break; case RegexLexer.SymEndGroup: this.currentGroup = this.currentGroup.EndGroup(); break; case int.MinValue: // EOF if (!this.currentGroup.IsRoot) { throw new InvalidOperationException("Regex has open groups"); } this.parseCallback?.Invoke(this.Flush()); break; default: throw new NotSupportedException("Unexpected symbol at index " + capture.Index); } }
public RegexFSMCaptureEndTransition(RegexGroup <T> group) => this.group = group ?? throw new ArgumentNullException(nameof(group));
protected virtual IRegexFSMTransition <T> GenerateNFATransitionFromRegexGroupReference( RegexGroupReference <T> groupReference, IRegexNFA <T> nfa, IRegexNFAState <T> state ) { RegexGroup <T> group; if (groupReference.IsDetermined) { group = groupReference.Group; } else { IRegexFSMEpsilonTransition <T> epsilonTransition = this.contextInfo.ActivateRegexFSMEpsilonTransition(); var groups = this.regexGroups.Where(_group => _group.ID == groupReference.GroupID).ToArray(); switch (groups.Length) { case 0: //throw new InvalidOperationException("未找到引用的正则组。"); epsilonTransition = this.contextInfo.ActivateRegexFSMEpsilonTransition(); nfa.AttachTransition(state, epsilonTransition); return(epsilonTransition); case 1: group = groups[0]; break; default: group = new RegexGroup <T>( groups.Select(_group => _group.InnerRegex).UnionMany() ); break; //throw new InvalidOperationException("找到多个重复 ID 的正则组。"); //epsilonTransition = this.contextInfo.ActivateRegexNFAEpsilonTransition(); //nfa.AttachTransition(state, epsilonTransition); //return epsilonTransition; } } IRegexNFAState <T> nextState = state; var lastCaptureReferenceTransition = new RegexFSMLastCaptureReferenceTransition <T>(group, group.ID, (sender, readerSource, handler, args) => { if (args.FirstOrDefault() is IRegexFSM <T> fsm) { if (fsm.TryGetLastCapture(sender.IDToken, sender.ID, out int start, out int length)) { var progressService = fsm.GetService <RegexFSM <T> .ProgressService>(); var progress = progressService.GetProgress(); foreach (var t in fsm.Inputs.Skip(start).Take(length)) { if (!(readerSource.HasNext() && EqualityComparer <T> .Default.Equals(readerSource.Read(), t))) { progressService.SetProgress(progress); return(false); } } return(true); } }