// // JvmReMachine.jvm.cs // // Author: // Arina Itkes // // Copyright (C) 2007 Mainsoft, Inc. // // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Collections.Generic; using System.Collections; using System.Text; using java.util.regex; using java.lang; namespace System.Text.RegularExpressions { sealed class JvmReMachine : BaseMachine { readonly PatternData _patternData; internal JvmReMachine (PatternData patternData) { this._patternData = patternData; } #region Properties internal PatternData PatternData { get { return _patternData; } } internal Pattern JavaPattern { get { return _patternData.JavaPattern; } } internal IDictionary Mapping { get { return _patternData.GroupNameToNumberMap; } set { throw new NotImplementedException ("Mapping setter of JvmReMachine should not be called."); }//We must implement the setter of interface but it is not in use } internal string [] NamesMapping { get { return _patternData.GroupNumberToNameMap; } set { throw new NotImplementedException ("NamesMapping setter of JvmReMachine should not be called."); }//We must implement the setter of interface but it is not in use } internal int GroupCount { get { return _patternData.GroupCount; } } #endregion Properties #region Implementations of IMachine Interface public override Match Scan (Regex regex, string text, int start, int end) { if (start > end) return Match.Empty; Matcher m = JavaPattern.matcher (((CharSequence) (object) text).subSequence(0, end)); if (!m.find (start)) { return System.Text.RegularExpressions.Match.Empty; } GroupCollection groups = new GroupCollection (regex.GroupCount + 1); Match match = new Match (regex, this, groups, text, text.Length, m.start (), m.end () - m.start ()); for (int javaGroupNumber = 1; javaGroupNumber <= m.groupCount (); ++javaGroupNumber) { AddGroup (m, groups, javaGroupNumber, text, match); } return match; } public override string [] Split (Regex regex, string input, int count, int startat) { string [] splitArray = JavaPattern.split ((CharSequence) (object) input.Substring (startat), count); if (regex.GroupCount == 0 || splitArray.Length == 1) { return splitArray; } if (count == 0) count = Int32.MaxValue; Matcher m = JavaPattern.matcher ((CharSequence) (object) input.Substring (startat)); int splitArrayIndex = 1; List splits = new List (splitArray.Length * (1 + regex.GroupCount)); splits.Add (splitArray [0]); for (int number = 0; number < count; ++number) { if (!m.find ()) break; for (int i = 1; i <= m.groupCount (); ++i) { splits.Add (m.group (i)); } splits.Add (splitArray [splitArrayIndex++]); } return splits.ToArray (); } public override string Replace (Regex regex, string input, string replacement, int count, int startat) { if (regex.SameGroupNamesFlag) { return base.Replace (regex, input, replacement, count, startat); } if (count < 0) { count = Int32.MaxValue; } string replacementPattern = ReplacementData.Reformat (regex, replacement); Matcher m = JavaPattern.matcher ((CharSequence) (object) input); StringBuffer sb = new StringBuffer (); if (count > 0 && m.find (startat)) { ReplacementData.ReplaceMatch (replacementPattern, m, sb, input, _patternData); } for (int matchesCounter = 1; matchesCounter < count; ++matchesCounter) { if (!m.find ()) { break; } ReplacementData.ReplaceMatch (replacementPattern, m, sb, input, _patternData); } m.appendTail (sb); return sb.ToString (); } public override string Result (string replacement, Match match) { if (match.Length == 0) return String.Empty; string result = Replace (match.Regex, match.Text, replacement, 1, 0); return result.Substring (match.Index, result.Length - (match.Text.Length - match.Length)); } #endregion Implementations of IMachine Interface private void AddGroup (Matcher m, GroupCollection groups, int javaGroupNumber, string text, Match match) { int netGroupNumber = _patternData.JavaToNetGroupNumbersMap [javaGroupNumber]; if (netGroupNumber == -1) { return; } int index = m.start (javaGroupNumber); if (index < 0){ if(groups[netGroupNumber] == null) groups.SetValue (new Group (), netGroupNumber); return; } Group group = new Group (text, index, m.end (javaGroupNumber) - index, match, netGroupNumber); groups.SetValue (group, netGroupNumber); } } }