├── .gitignore ├── .travis.yml ├── LICENSE ├── NUnitTests ├── EngineHelpWrapper.cs ├── MainTestClass.cs ├── NUnitTests.csproj ├── Tests │ ├── external.os │ └── testrunner.os └── packages.config ├── README.md ├── TestApp ├── Program.cs ├── Properties │ └── AssemblyInfo.cs ├── TestApp.csproj └── packages.config ├── appveyor.yml ├── docs └── Reference.md ├── oscript-component.sln ├── oscript-component ├── Properties │ └── AssemblyInfo.cs ├── VerbalExpression.cs ├── oscript-component.csproj └── packages.config ├── package-loader.os ├── packagedef └── testcomponent.os /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | \.idea/ 3 | 4 | \.vs/ 5 | 6 | *.ospx 7 | 8 | bin/ 9 | obj/ 10 | packages/ 11 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: csharp 2 | install: 3 | - wget https://dist.nuget.org/win-x86-commandline/latest/nuget.exe 4 | - mono nuget.exe restore 5 | - mono nuget.exe install NUnit.ConsoleRunner -Version 3.6.1 -OutputDirectory testrunner 6 | script: 7 | - xbuild /p:Configuration=Release 8 | - mono ./testrunner/NUnit.ConsoleRunner.3.6.1/tools/nunit3-console.exe ./NUnitTests/bin/Release/NUnitTests.dll 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Nikita Gryzlov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /NUnitTests/EngineHelpWrapper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.Reflection; 4 | using NUnit.Framework; 5 | using ScriptEngine.Machine.Contexts; 6 | using ScriptEngine.HostedScript.Library; 7 | using ScriptEngine.Machine; 8 | using ScriptEngine.Environment; 9 | using ScriptEngine.HostedScript; 10 | 11 | namespace NUnitTests 12 | { 13 | public class EngineHelpWrapper : IHostApplication 14 | { 15 | 16 | private HostedScriptEngine engine; 17 | 18 | public EngineHelpWrapper() 19 | { 20 | } 21 | 22 | public HostedScriptEngine Engine 23 | { 24 | get 25 | { 26 | return engine; 27 | } 28 | } 29 | 30 | public IValue TestRunner { get; private set; } 31 | 32 | public HostedScriptEngine StartEngine() 33 | { 34 | engine = new HostedScriptEngine(); 35 | engine.Initialize(); 36 | 37 | // Тут можно указать любой класс из компоненты 38 | engine.AttachAssembly(System.Reflection.Assembly.GetAssembly(typeof(OnescriptVerbalExpressions.VerbalExpression))); 39 | 40 | // Если проектов компонент несколько, то надо взять по классу из каждой из них 41 | // engine.AttachAssembly(System.Reflection.Assembly.GetAssembly(typeof(oscriptcomponent_2.MyClass_2))); 42 | // engine.AttachAssembly(System.Reflection.Assembly.GetAssembly(typeof(oscriptcomponent_3.MyClass_3))); 43 | 44 | // Подключаем тестовую оболочку 45 | engine.AttachAssembly(System.Reflection.Assembly.GetAssembly(typeof(EngineHelpWrapper))); 46 | 47 | var testrunnerSource = LoadFromAssemblyResource("NUnitTests.Tests.testrunner.os"); 48 | var testrunnerModule = engine.GetCompilerService().CreateModule(testrunnerSource); 49 | 50 | { 51 | var mi = engine.GetType().GetMethod("SetGlobalEnvironment", 52 | BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Instance); 53 | mi.Invoke(engine, new object[] {this, testrunnerSource}); 54 | } 55 | 56 | engine.LoadUserScript(new ScriptEngine.UserAddedScript() 57 | { 58 | Type = ScriptEngine.UserAddedScriptType.Class, 59 | Module = testrunnerModule, 60 | Symbol = "TestRunner" 61 | }); 62 | 63 | var testRunner = AttachedScriptsFactory.ScriptFactory("TestRunner", new IValue[] { }); 64 | TestRunner = ValueFactory.Create(testRunner); 65 | 66 | return engine; 67 | } 68 | 69 | public void RunTestScript(string resourceName) 70 | { 71 | var source = LoadFromAssemblyResource(resourceName); 72 | var module = engine.GetCompilerService().CreateModule(source); 73 | 74 | engine.LoadUserScript(new ScriptEngine.UserAddedScript() 75 | { 76 | Type = ScriptEngine.UserAddedScriptType.Class, 77 | Module = module, 78 | Symbol = resourceName 79 | }); 80 | 81 | var test = AttachedScriptsFactory.ScriptFactory(resourceName, new IValue[] { }); 82 | ArrayImpl testArray; 83 | { 84 | int methodIndex = test.FindMethod("ПолучитьСписокТестов"); 85 | 86 | { 87 | IValue ivTests; 88 | test.CallAsFunction(methodIndex, new IValue[] { TestRunner }, out ivTests); 89 | testArray = ivTests as ArrayImpl; 90 | } 91 | } 92 | 93 | foreach (var ivTestName in testArray) 94 | { 95 | string testName = ivTestName.AsString(); 96 | int methodIndex = test.FindMethod(testName); 97 | if (methodIndex == -1) 98 | { 99 | // Тест указан, но процедуры нет или она не экспортирована 100 | continue; 101 | } 102 | 103 | test.CallAsProcedure(methodIndex, new IValue[] { }); 104 | } 105 | } 106 | 107 | public ICodeSource LoadFromAssemblyResource(string resourceName) 108 | { 109 | var asm = System.Reflection.Assembly.GetExecutingAssembly(); 110 | string codeSource; 111 | 112 | using (Stream s = asm.GetManifestResourceStream(resourceName)) 113 | { 114 | using (StreamReader r = new StreamReader(s)) 115 | { 116 | codeSource = r.ReadToEnd(); 117 | } 118 | } 119 | 120 | return engine.Loader.FromString(codeSource); 121 | } 122 | 123 | public void Echo(string str, MessageStatusEnum status = MessageStatusEnum.Ordinary) 124 | { 125 | Console.WriteLine(str); 126 | } 127 | 128 | public string[] GetCommandLineArguments() 129 | { 130 | return new string[] { }; 131 | } 132 | 133 | public bool InputString(out string result, int maxLen) 134 | { 135 | result = ""; 136 | return false; 137 | } 138 | 139 | public void ShowExceptionInfo(Exception exc) 140 | { 141 | } 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /NUnitTests/MainTestClass.cs: -------------------------------------------------------------------------------- 1 | using NUnit.Framework; 2 | using OnescriptVerbalExpressions; 3 | 4 | // Используется NUnit 3.6 5 | 6 | namespace NUnitTests 7 | { 8 | [TestFixture] 9 | public class MainTestClass 10 | { 11 | 12 | private EngineHelpWrapper host; 13 | 14 | [OneTimeSetUp] 15 | public void Initialize() 16 | { 17 | host = new EngineHelpWrapper(); 18 | host.StartEngine(); 19 | } 20 | 21 | [Test] 22 | public void TestAsInternalObjects() 23 | { 24 | var verbalExpression = new VerbalExpression(); 25 | 26 | verbalExpression.Word().WithAnyCase(false); 27 | 28 | Assert.AreEqual(verbalExpression.ToStringImpl(), "\\w+"); 29 | 30 | var oscriptRegExpImpl = verbalExpression.ToRegex(); 31 | Assert.NotNull(oscriptRegExpImpl); 32 | } 33 | 34 | 35 | [Test] 36 | public void TestAsExternalObjects() 37 | { 38 | host.RunTestScript("NUnitTests.Tests.external.os"); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /NUnitTests/NUnitTests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | AnyCPU 6 | {9A739C32-D551-43B0-920A-D9C53367BC38} 7 | Library 8 | NUnitTests 9 | NUnitTests 10 | v4.5 11 | 12 | 13 | true 14 | full 15 | false 16 | bin\Debug 17 | DEBUG; 18 | prompt 19 | 4 20 | 21 | 22 | true 23 | bin\Release 24 | prompt 25 | 4 26 | 27 | 28 | 29 | 30 | ..\packages\DotNetZip.1.10.1\lib\net20\DotNetZip.dll 31 | 32 | 33 | ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll 34 | 35 | 36 | ..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll 37 | 38 | 39 | ..\packages\OneScript.1.0.16\lib\net40\ScriptEngine.dll 40 | 41 | 42 | ..\packages\OneScript.StandardLibrary.1.0.16\lib\net40\ScriptEngine.HostedScript.dll 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | {EA173D06-CCD2-45D5-A263-DC866289517A} 55 | oscript-component 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /NUnitTests/Tests/external.os: -------------------------------------------------------------------------------- 1 | Перем юТест; 2 | 3 | //////////////////////////////////////////////////////////////////// 4 | // Программный интерфейс 5 | 6 | Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт 7 | 8 | юТест = ЮнитТестирование; 9 | 10 | ВсеТесты = Новый Массив; 11 | 12 | ВсеТесты.Добавить("ТестДолжен_ПроверитьКомпиляциюРегЭкспаВСтроку"); 13 | ВсеТесты.Добавить("ТестДолжен_ПроверитьКомпиляциюРегЭкспаВРегЭксп"); 14 | ВсеТесты.Добавить("ТестДолжен_ПроверитьКомпиляциюСложногоРегЭкспаВСтроку"); 15 | ВсеТесты.Добавить("ТестДолжен_ПроверитьКомпиляциюКаналящегосяРегЭкспаВСтроку"); 16 | ВсеТесты.Добавить("ТестДолжен_ПроверитьАнглийскиеСинонимы"); 17 | ВсеТесты.Добавить("ТестДолжен_ПроверитьURL"); 18 | ВсеТесты.Добавить("ТестДолжен_ПроверитьДиапазон"); 19 | ВсеТесты.Добавить("ТестДолжен_ПроверитьЛюбойДиапазон"); 20 | ВсеТесты.Добавить("ТестДолжен_ПроверитьПовтор"); 21 | ВсеТесты.Добавить("ТестДолжен_ПроверитьОдинИлиБольше"); 22 | ВсеТесты.Добавить("ТестДолжен_ПроверитьМодификаторРегулярногоВыражения"); 23 | ВсеТесты.Добавить("ТестДолжен_ПроверитьШорткаты"); 24 | 25 | Возврат ВсеТесты; 26 | 27 | КонецФункции 28 | 29 | Процедура ТестДолжен_ПроверитьКомпиляциюРегЭкспаВСтроку() Экспорт 30 | 31 | ВербальноеВыражение = Новый ВербальноеВыражение(); 32 | 33 | Результат = ВербальноеВыражение.ВСтроку(); 34 | 35 | юТест.ПроверитьРавенство(Результат, ""); 36 | 37 | КонецПроцедуры 38 | 39 | Процедура ТестДолжен_ПроверитьКомпиляциюРегЭкспаВРегЭксп() Экспорт 40 | 41 | ВербальноеВыражение = Новый ВербальноеВыражение(); 42 | 43 | ВербальноеВыражение.ЧтоНибудьНоНе("№"); 44 | Результат = ВербальноеВыражение.ВРегулярноеВыражение(); 45 | 46 | юТест.ПроверитьРавенство(ТипЗнч(Результат), Тип("РегулярноеВыражение")); 47 | юТест.ПроверитьИстину(Результат.Совпадает("КакоеТоСлово")); 48 | юТест.ПроверитьЛожь(Результат.Совпадает("№")); 49 | 50 | 51 | КонецПроцедуры 52 | 53 | Процедура ТестДолжен_ПроверитьКомпиляциюСложногоРегЭкспаВСтроку() Экспорт 54 | 55 | ВербальноеВыражение = Новый ВербальноеВыражение(); 56 | 57 | ВербальноеВыражение.Слово(); 58 | Результат = ВербальноеВыражение.ВСтроку(); 59 | 60 | юТест.ПроверитьРавенство(Результат, "\w+"); 61 | 62 | КонецПроцедуры 63 | 64 | Процедура ТестДолжен_ПроверитьКомпиляциюКаналящегосяРегЭкспаВСтроку() Экспорт 65 | 66 | ВербальноеВыражение = Новый ВербальноеВыражение(); 67 | 68 | Результат = Новый ВербальноеВыражение() 69 | .НачалоСтроки() 70 | .ЧтоУгодноНоНе("123") 71 | .ЧтоУгодно() 72 | .Слово() 73 | .МожетБыть("раз-два-три") 74 | .Слово() 75 | .КонецСтроки() 76 | .ВСтроку(); 77 | 78 | юТест.ПроверитьРавенство(Результат, "^([^123]*)(.*)\w+(раз-два-три)?\w+$"); 79 | 80 | КонецПроцедуры 81 | 82 | Процедура ТестДолжен_ПроверитьАнглийскиеСинонимы() Экспорт 83 | 84 | ВербальноеВыражение = Новый VerbalExpression(); 85 | 86 | ВербальноеВыражение.Word(); 87 | Результат = ВербальноеВыражение.ToString(); 88 | 89 | юТест.ПроверитьРавенство(Результат, "\w+"); 90 | 91 | КонецПроцедуры 92 | 93 | Процедура ТестДолжен_ПроверитьURL() Экспорт 94 | 95 | // На выходе - (((http)(s)?)|(ftp))(://)(.+) 96 | ВербальноеВыражение = Новый ВербальноеВыражение() 97 | .Найти( 98 | Новый ВербальноеВыражение() 99 | .Найти("http") 100 | .МожетБыть("s") 101 | .Либо("ftp") 102 | .ВСтроку(), 103 | Ложь 104 | ) 105 | .Затем("://") 106 | .ЧтоНибудь(); 107 | 108 | РегулярноеВыражение = ВербальноеВыражение.ВРегулярноеВыражение(); 109 | 110 | юТест.ПроверитьИстину(РегулярноеВыражение.Совпадает("https://google.com")); 111 | юТест.ПроверитьИстину(РегулярноеВыражение.Совпадает("http://google.com")); 112 | юТест.ПроверитьИстину(РегулярноеВыражение.Совпадает("ftp://google.com")); 113 | юТест.ПроверитьЛожь(РегулярноеВыражение.Совпадает("http://")); 114 | юТест.ПроверитьЛожь(РегулярноеВыражение.Совпадает("фывфывфыв://asdasd")); 115 | 116 | КонецПроцедуры 117 | 118 | Процедура ТестДолжен_ПроверитьДиапазон() Экспорт 119 | 120 | ВербальноеВыражение = Новый ВербальноеВыражение(); 121 | ВербальноеВыражение.Диапазон("0", "9"); 122 | 123 | Результат = ВербальноеВыражение.ВСтроку(); 124 | 125 | юТест.ПроверитьРавенство(Результат, "[0-9]"); 126 | 127 | КонецПроцедуры 128 | 129 | Процедура ТестДолжен_ПроверитьЛюбойДиапазон() Экспорт 130 | 131 | ВербальноеВыражение = Новый ВербальноеВыражение(); 132 | ВербальноеВыражение.ЛюбойИз("123абв"); 133 | 134 | Результат = ВербальноеВыражение.ВСтроку(); 135 | 136 | юТест.ПроверитьРавенство(Результат, "[123абв]"); 137 | 138 | КонецПроцедуры 139 | 140 | Процедура ТестДолжен_ПроверитьПовтор() Экспорт 141 | 142 | Результат = Новый ВербальноеВыражение() 143 | .Найти("а") 144 | .ПовторитьПредыдущее(1) 145 | .ВСтроку(); 146 | 147 | юТест.ПроверитьРавенство(Результат, "(а){1}"); 148 | 149 | Результат = Новый ВербальноеВыражение() 150 | .Найти("а") 151 | .ПовторитьПредыдущееОтИДо(1, 2) 152 | .ВСтроку(); 153 | 154 | юТест.ПроверитьРавенство(Результат, "(а){1,2}"); 155 | 156 | КонецПроцедуры 157 | 158 | 159 | Процедура ТестДолжен_ПроверитьОдинИлиБольше() Экспорт 160 | 161 | Результат = Новый ВербальноеВыражение() 162 | .Найти("а") 163 | .ОдинИлиБольше() 164 | .ВСтроку(); 165 | 166 | юТест.ПроверитьРавенство(Результат, "(а)+"); 167 | 168 | Результат = Новый ВербальноеВыражение() 169 | .ОдинИлиБольше("а") 170 | .ВСтроку(); 171 | 172 | юТест.ПроверитьРавенство(Результат, "(а)+"); 173 | 174 | КонецПроцедуры 175 | 176 | Процедура ТестДолжен_ПроверитьМодификаторРегулярногоВыражения() Экспорт 177 | 178 | Результат = Новый ВербальноеВыражение() 179 | .Найти("а") 180 | .СЛюбымРегистром(Истина) 181 | .ВРегулярноеВыражение(); 182 | 183 | юТест.ПроверитьИстину(Результат.Совпадает("А")); 184 | 185 | Результат = Новый ВербальноеВыражение() 186 | .Найти("а") 187 | .СЛюбымРегистром(Ложь) 188 | .ВРегулярноеВыражение(); 189 | 190 | юТест.ПроверитьЛожь(Результат.Совпадает("А")); 191 | 192 | КонецПроцедуры 193 | 194 | Процедура ТестДолжен_ПроверитьШорткаты() Экспорт 195 | 196 | Результат = Новый ВербальноеВыражение() 197 | .Число() 198 | .Число() 199 | .ПробельныйСимвол() 200 | .ВРегулярноеВыражение(); 201 | 202 | юТест.ПроверитьИстину(Результат.Совпадает("12 ")); 203 | юТест.ПроверитьЛожь(Результат.Совпадает("ф")); 204 | 205 | КонецПроцедуры 206 | -------------------------------------------------------------------------------- /NUnitTests/Tests/testrunner.os: -------------------------------------------------------------------------------- 1 | ////////////////////////////////////////////////////////////////// 2 | // 3 | // Объект-помощник для приемочного и юнит-тестирования (урезанный testrunner) 4 | // 5 | ////////////////////////////////////////////////////////////////// 6 | 7 | Перем Пути; 8 | Перем КомандаЗапуска; 9 | Перем НаборТестов; 10 | Перем РезультатТестирования; 11 | 12 | Перем ПутьЛогФайлаJUnit; 13 | 14 | Перем НомерТестаДляЗапуска; 15 | Перем НаименованиеТестаДляЗапуска; 16 | 17 | Перем Рефлектор; 18 | 19 | Перем ЗначенияСостоянияТестов; 20 | Перем СтруктураПараметровЗапуска; 21 | 22 | Перем НаборОшибок; 23 | Перем НаборНереализованныхТестов; 24 | 25 | Перем ВсегоТестов; 26 | Перем ВыводитьОшибкиПодробно; 27 | 28 | Перем ВременныеФайлы; 29 | 30 | ////////////////////////////////////////////////////////////////////////////// 31 | // Программный интерфейс 32 | // 33 | 34 | Функция ФорматДСО(ДопСообщениеОшибки) 35 | Если ДопСообщениеОшибки = "" Тогда 36 | Возврат ""; 37 | КонецЕсли; 38 | 39 | Возврат Символы.ПС + ДопСообщениеОшибки; 40 | КонецФункции 41 | 42 | Функция ПредставлениеПериода(ДатаНачала, ДатаОкончания, ФорматнаяСтрока = Неопределено) 43 | Возврат "с "+ДатаНачала+" по "+ДатаОкончания; 44 | КонецФункции 45 | 46 | Процедура ПодробныеОписанияОшибок(Знач ВключитьПодробноеОписание) Экспорт 47 | ВыводитьОшибкиПодробно = ВключитьПодробноеОписание; 48 | КонецПроцедуры 49 | 50 | //{ МЕТОДЫ ДЛЯ ПРОВЕРКИ ЗНАЧЕНИЙ (assertions). 51 | 52 | Процедура Проверить(Условие, ДопСообщениеОшибки = "") Экспорт 53 | Если Не Условие Тогда 54 | СообщениеОшибки = "Переданный параметр ("+Формат(Условие, "БЛ=ложь; БИ=истина")+") не является Истиной, а хотели, чтобы являлся." + ФорматДСО(ДопСообщениеОшибки); 55 | ВызватьИсключение(СообщениеОшибки); 56 | КонецЕсли; 57 | КонецПроцедуры 58 | 59 | Процедура ПроверитьИстину(Условие, ДопСообщениеОшибки = "") Экспорт 60 | Проверить(Условие, ДопСообщениеОшибки); 61 | КонецПроцедуры 62 | 63 | Процедура ПроверитьЛожь(Условие, ДопСообщениеОшибки = "") Экспорт 64 | Если Условие Тогда 65 | СообщениеОшибки = "Переданный параметр ("+Формат(Условие, "БЛ=ложь; БИ=истина")+") не является Ложью, а хотели, чтобы являлся." + ФорматДСО(ДопСообщениеОшибки); 66 | ВызватьИсключение(СообщениеОшибки); 67 | КонецЕсли; 68 | КонецПроцедуры 69 | 70 | Процедура ПроверитьДату(_Дата, _Период, ДопСообщениеОшибки = "") Экспорт 71 | Если _Дата < _Период.ДатаНачала или _Дата > _Период.ДатаОкончания Тогда 72 | представление = ПредставлениеПериода(_Период.ДатаНачала, _Период.ДатаОкончания, "ФП = Истина"); 73 | СообщениеОшибки = "Переданный параметр ("+Формат(_Дата, "ДФ='dd.MM.yyyy HH:mm:ss'")+") не входит в период "+представление+", а хотели, чтобы являлся." + ФорматДСО(ДопСообщениеОшибки); 74 | ВызватьИсключение(СообщениеОшибки); 75 | КонецЕсли; 76 | КонецПроцедуры 77 | 78 | Процедура ПроверитьРавенство(ПервоеЗначение, ВтороеЗначение, ДопСообщениеОшибки = "") Экспорт 79 | Если ПервоеЗначение <> ВтороеЗначение Тогда 80 | СообщениеОшибки = "Сравниваемые значения ("+ПервоеЗначение+"; "+ВтороеЗначение+") не равны, а хотели, чтобы были равны." + ФорматДСО(ДопСообщениеОшибки); 81 | ВызватьИсключение(СообщениеОшибки); 82 | КонецЕсли; 83 | КонецПроцедуры 84 | 85 | Процедура ПроверитьНеРавенство(ПервоеЗначение, ВтороеЗначение, ДопСообщениеОшибки = "") Экспорт 86 | Если ПервоеЗначение = ВтороеЗначение Тогда 87 | СообщениеОшибки = "Сравниваемые значения ("+ПервоеЗначение+"; "+ВтороеЗначение+") равны, а хотели, чтобы были не равны." + ФорматДСО(ДопСообщениеОшибки); 88 | ВызватьИсключение(СообщениеОшибки); 89 | КонецЕсли; 90 | КонецПроцедуры 91 | 92 | Процедура ПроверитьБольше(_Больше, _Меньше, ДопСообщениеОшибки = "") Экспорт 93 | Если _Больше <= _Меньше Тогда 94 | СообщениеОшибки = "Первый параметр ("+_Больше+") меньше или равен второму ("+_Меньше+") а хотели, чтобы был больше." + ФорматДСО(ДопСообщениеОшибки); 95 | ВызватьИсключение(СообщениеОшибки); 96 | КонецЕсли; 97 | КонецПроцедуры 98 | 99 | Процедура ПроверитьБольшеИлиРавно(_Больше, _Меньше, ДопСообщениеОшибки = "") Экспорт 100 | Если _Больше < _Меньше Тогда 101 | СообщениеОшибки = "Первый параметр ("+_Больше+") меньше второго ("+_Меньше+") а хотели, чтобы был больше или равен." + ФорматДСО(ДопСообщениеОшибки); 102 | ВызватьИсключение(СообщениеОшибки); 103 | КонецЕсли; 104 | КонецПроцедуры 105 | 106 | Процедура ПроверитьМеньше(проверяемоеЗначение1, проверяемоеЗначение2, СообщениеОбОшибке = "") Экспорт 107 | Если проверяемоеЗначение1 >= проверяемоеЗначение2 Тогда 108 | ВызватьИсключение "Значение <"+проверяемоеЗначение1+"> больше или равно, чем <"+проверяемоеЗначение2+">, а ожидалось меньше"+ 109 | ФорматДСО(СообщениеОбОшибке); 110 | КонецЕсли; 111 | КонецПроцедуры 112 | 113 | Процедура ПроверитьМеньшеИлиРавно(проверяемоеЗначение1, проверяемоеЗначение2, СообщениеОбОшибке = "") Экспорт 114 | Если проверяемоеЗначение1 > проверяемоеЗначение2 Тогда 115 | ВызватьИсключение "Значение <"+проверяемоеЗначение1+"> больше, чем <"+проверяемоеЗначение2+">, а ожидалось меньше или равно"+ 116 | ФорматДСО(СообщениеОбОшибке); 117 | КонецЕсли; 118 | КонецПроцедуры 119 | 120 | // проверка идет через ЗначениеЗаполнено, но мутабельные значение всегда считаем заполненными 121 | Процедура ПроверитьЗаполненность(ПроверяемоеЗначение, ДопСообщениеОшибки = "") Экспорт 122 | Попытка 123 | фЗаполнено = ЗначениеЗаполнено(ПроверяемоеЗначение); 124 | Исключение 125 | Возврат; 126 | КонецПопытки; 127 | Если НЕ фЗаполнено Тогда 128 | ВызватьИсключение "Значение ("+ПроверяемоеЗначение+") не заполнено, а ожидалась заполненность" + ФорматДСО(ДопСообщениеОшибки); 129 | КонецЕсли; 130 | КонецПроцедуры 131 | 132 | Процедура ПроверитьНеЗаполненность(ПроверяемоеЗначение, ДопСообщениеОшибки = "") Экспорт 133 | СообщениеОшибки = "Значение ("+ПроверяемоеЗначение+") заполнено, а ожидалась незаполненность" + ФорматДСО(ДопСообщениеОшибки); 134 | Попытка 135 | фЗаполнено = ЗначениеЗаполнено(ПроверяемоеЗначение); 136 | Исключение 137 | ВызватьИсключение СообщениеОшибки; 138 | КонецПопытки; 139 | Если фЗаполнено Тогда 140 | ВызватьИсключение СообщениеОшибки; 141 | КонецЕсли; 142 | КонецПроцедуры 143 | 144 | Процедура ПроверитьВхождение(строка, подстрокаПоиска, ДопСообщениеОшибки = "") Экспорт 145 | Если Найти(строка, подстрокаПоиска) = 0 Тогда 146 | СообщениеОшибки = "Искали в <"+строка+"> подстроку <"+подстрокаПоиска+">, но не нашли." + ФорматДСО(ДопСообщениеОшибки); 147 | ВызватьИсключение(СообщениеОшибки); 148 | КонецЕсли; 149 | КонецПроцедуры 150 | 151 | Процедура ТестПройден() Экспорт 152 | КонецПроцедуры 153 | 154 | Процедура ТестПровален(ДопСообщениеОшибки) Экспорт 155 | СообщениеОшибки = "Тест провален." + ФорматДСО(ДопСообщениеОшибки); 156 | ВызватьИсключение(СообщениеОшибки); 157 | КонецПроцедуры 158 | 159 | //} 160 | 161 | // { временные файлы 162 | Функция ИмяВременногоФайла(Знач Расширение = "tmp") Экспорт 163 | Если ВременныеФайлы = Неопределено Тогда 164 | ВременныеФайлы = Новый Массив; 165 | КонецЕсли; 166 | 167 | ИмяВремФайла = ПолучитьИмяВременногоФайла(Расширение); 168 | ВременныеФайлы.Добавить(ИмяВремФайла); 169 | Возврат ИмяВремФайла; 170 | КонецФункции 171 | 172 | Процедура УдалитьВременныеФайлы() Экспорт 173 | 174 | Если ВременныеФайлы <> Неопределено Тогда 175 | Для Каждого ИмяФайла Из ВременныеФайлы Цикл 176 | Попытка 177 | УдалитьФайлы(ИмяФайла); 178 | Исключение 179 | Сообщить("Не удален временный файл: " + ИмяФайла + " 180 | |-" + ОписаниеОшибки()); 181 | КонецПопытки; 182 | КонецЦикла; 183 | 184 | ВременныеФайлы.Очистить(); 185 | 186 | КонецЕсли; 187 | 188 | КонецПроцедуры 189 | // } 190 | Функция ВСтрокеСодержатсяТолькоЦифры(Знач ИсходнаяСтрока) Экспорт 191 | 192 | рез = Ложь; 193 | ДлинаСтроки = СтрДлина(ИсходнаяСтрока); 194 | Для Сч = 1 По ДлинаСтроки Цикл 195 | ТекущийСимвол = КодСимвола(Сред(ИсходнаяСтрока, Сч, 1)); 196 | Если 48 <= ТекущийСимвол И ТекущийСимвол <= 57 Тогда 197 | рез = Истина; 198 | Иначе 199 | рез = Ложь; 200 | Прервать; 201 | КонецЕсли; 202 | КонецЦикла; 203 | Возврат рез; 204 | КонецФункции 205 | 206 | // Выводит сообщение. В тестах ВСЕГДА должна использоваться ВМЕСТО метода Сообщить(). 207 | // 208 | 209 | Функция ВывестиПредупреждение(Ошибка) Экспорт 210 | 211 | НужныйТекстОшибки = Ошибка; 212 | 213 | ВывестиСообщение("ПРЕДУПРЕЖДЕНИЕ: " + НужныйТекстОшибки, СтатусСообщения.Внимание); 214 | 215 | Возврат НужныйТекстОшибки; 216 | КонецФункции 217 | 218 | Функция ВывестиСообщение(ТекстСообщения, Статус = Неопределено) Экспорт 219 | Если Статус = Неопределено Тогда 220 | Статус = СтатусСообщения.Обычное; 221 | КонецЕсли; 222 | 223 | Сообщить(ТекстСообщения, Статус); 224 | КонецФункции 225 | 226 | // Вызывает исключение с заданным текстом ошибки для прерывания выполнения тестового случая. 227 | // 228 | Функция ПрерватьТест(ТекстОшибки) Экспорт 229 | 230 | ВызватьИсключение ТекстОшибки; 231 | 232 | КонецФункции 233 | 234 | Функция ВывестиОшибку(Ошибка) Экспорт 235 | 236 | НужныйТекстОшибки = Ошибка; 237 | 238 | ВывестиСообщение("ОШИБКА: " + НужныйТекстОшибки, СтатусСообщения.Важное); 239 | 240 | Возврат НужныйТекстОшибки; 241 | КонецФункции 242 | 243 | ВыводитьОшибкиПодробно = Ложь; 244 | 245 | -------------------------------------------------------------------------------- /NUnitTests/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OneScript Verbal Expressions 2 | 3 | [![Build status](https://ci.appveyor.com/api/projects/status/y3j2uvwgthf4rmfu/branch/develop?svg=true)](https://ci.appveyor.com/project/nixel2007/verbal-expressions/branch/develop) 4 | [![Build Status](https://travis-ci.org/oscript-library/verbal-expressions.svg?branch=develop)](https://travis-ci.org/oscript-library/verbal-expressions) 5 | 6 | ## Регулярные выражения - это просто! 7 | 8 | verbal-expressions - это библиотека для OneScript, помогающая собирать сложные регулярные выражения. 9 | 10 | ## Установка 11 | 12 | ### С хаба пакетов 13 | 14 | `opm install verbal-expressions` 15 | 16 | ### С релизов GitHub 17 | 18 | 1. Перейти на [страницу релизов](https://github.com/oscript-library/verbal-expessions/releases) 19 | 1. Скачать артефакт verbal-expressions-x.y.z.ospx 20 | 1. Установить с помощью opm: `opm install -f verbal-expressions-x.y.z.ospx` 21 | 22 | ### С AppVeyor 23 | 24 | 1. Перейти на страницу [последней сборки](https://ci.appveyor.com/project/nixel2007/verbal-expressions) или [истории сборок](https://ci.appveyor.com/project/nixel2007/verbal-expressions/history) и выбрать интересующую сборку 25 | 1. Перейти в раздел Artifacts 26 | 1. Скачать артефакт verbal-expressions-x.y.z.ospx 27 | 1. Установить с помощью opm: `opm install -f verbal-expressions-x.y.z.ospx` 28 | 29 | ## Использование 30 | 31 | Несколько примеров использования Вербальных выражений: 32 | 33 | ### Проверка валидности URL 34 | 35 | ```bsl 36 | #Использовать verbal-expressions 37 | 38 | // Проверим корректность формирования URL 39 | 40 | ВербальноеВыражение = Новый ВербальноеВыражение() 41 | .НачалоСтроки() 42 | .Затем("http") 43 | .МожетБыть("s") 44 | .Затем("://") 45 | .ЧтоНибудьНоНе(" ") 46 | .КонецСтроки(); 47 | 48 | ТекстРегулярногоВыражения = ВербальноеВыражение.ВСтроку(); 49 | Сообщить(ТекстРегулярногоВыражения); // ^(http)(s)?(://)([^ ]+)$ 50 | 51 | РегулярноеВыражение = ВербальноеВыражение.ВРегулярноеВыражение(); 52 | ПроверяемаяСтрока = "https://www.google.com"; 53 | 54 | Если РегулярноеВыражение.Совпадает(ПроверяемаяСтрока) Тогда 55 | Сообщить("URL корректен"); 56 | Иначе 57 | Сообщить("URL некорректен"); 58 | КонецЕсли; 59 | ``` 60 | 61 | ### Вложенное "или" 62 | 63 | ```bsl 64 | #Использовать verbal-expressions 65 | 66 | // Проверим корректность формирования URL. Допустимые схемы - http[s] и ftp 67 | 68 | ЭкранироватьПереданноеЗначение = Ложь; 69 | 70 | ВербальноеВыражение = Новый ВербальноеВыражение() 71 | .НачалоСтроки() 72 | .Затем( 73 | Новый ВербальноеВыражение() 74 | .Найти("http") 75 | .МожетБыть("s") 76 | .Либо("ftp") 77 | .ВСтроку(), 78 | ЭкранироватьПереданноеЗначение 79 | ) 80 | .Затем("://") 81 | .ЧтоНибудьНоНе(" ") 82 | .КонецСтроки(); 83 | 84 | ТекстРегулярногоВыражения = ВербальноеВыражение.ВСтроку(); 85 | Сообщить(ТекстРегулярногоВыражения); // ^(((http)(s)?)|(ftp))(://)([^ ]+)$ 86 | ``` 87 | 88 | Больше примеров в [файле с приемочными тестами](https://github.com/oscript-library/verbal-expessions/blob/master/NUnitTests/Tests/external.os). 89 | 90 | ## Список методов 91 | 92 | Список методов и их описание доступно в файле [docs/Reference.md](docs/Reference.md) 93 | 94 | ## ToDo 95 | 96 | * Пробросить методы объекта РегулярноеВыражение в ВербальноеВыражение для упрощения использования 97 | * Добавить новых ништяков 98 | 99 | -------------------------------------------------------------------------------- /TestApp/Program.cs: -------------------------------------------------------------------------------- 1 | // Исполняемое приложение для запуска компоненты под отладчиком 2 | 3 | // В проекте TestApp в "Ссылки" ("References") должен быть добавлен проект компоненты 4 | // В проекте TestApp должны быть подключены NuGet пакеты OneScript и OneScript.Library 5 | 6 | using System; 7 | using ScriptEngine.HostedScript; 8 | using ScriptEngine.HostedScript.Library; 9 | 10 | namespace TestApp 11 | { 12 | class MainClass : IHostApplication 13 | { 14 | 15 | static readonly string SCRIPT = @"// Отладочный скрипт 16 | // в котором уже подключена наша компонента 17 | Слагаемое1 = Новый Слагаемое(5); 18 | Слагаемое2 = Новый Слагаемое(Слагаемое1); 19 | 20 | Складыватель = Новый Сложение; 21 | Складыватель.ДобавитьСлагаемое(Слагаемое1); 22 | Складыватель.ДобавитьСлагаемое(Слагаемое2); 23 | //Складыватель.ДобавитьСлагаемое('20150601'); 24 | 25 | Сумма = Складыватель.Вычислить(); 26 | 27 | Сообщить(""Получилось: "" + Сумма); 28 | " 29 | ; 30 | 31 | public static HostedScriptEngine StartEngine() 32 | { 33 | var engine = new ScriptEngine.HostedScript.HostedScriptEngine(); 34 | engine.Initialize(); 35 | 36 | // Тут можно указать любой класс из компоненты 37 | engine.AttachAssembly(System.Reflection.Assembly.GetAssembly(typeof(OnescriptVerbalExpressions.VerbalExpression))); 38 | 39 | // Если проектов компонент несколько, то надо взять по классу из каждой из них 40 | // engine.AttachAssembly(System.Reflection.Assembly.GetAssembly(typeof(oscriptcomponent_2.MyClass_2))); 41 | // engine.AttachAssembly(System.Reflection.Assembly.GetAssembly(typeof(oscriptcomponent_3.MyClass_3))); 42 | 43 | return engine; 44 | } 45 | 46 | public static void Main(string[] args) 47 | { 48 | var engine = StartEngine(); 49 | var script = engine.Loader.FromString(SCRIPT); 50 | var process = engine.CreateProcess(new MainClass(), script); 51 | 52 | var result = process.Start(); // Запускаем наш тестовый скрипт 53 | 54 | Console.WriteLine("Result = {0}", result); 55 | 56 | // ВАЖНО: движок перехватывает исключения, для отладки можно пользоваться только точками останова. 57 | } 58 | 59 | public void Echo(string str, MessageStatusEnum status = MessageStatusEnum.Ordinary) 60 | { 61 | Console.WriteLine(str); 62 | } 63 | 64 | public void ShowExceptionInfo(Exception exc) 65 | { 66 | Console.WriteLine(exc.ToString()); 67 | } 68 | 69 | public bool InputString(out string result, int maxLen) 70 | { 71 | throw new NotImplementedException(); 72 | } 73 | 74 | public string[] GetCommandLineArguments() 75 | { 76 | return new string[] { "1", "2", "3" }; // Здесь можно зашить список аргументов командной строки 77 | } 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /TestApp/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | 4 | // Information about this assembly is defined by the following attributes. 5 | // Change them to the values specific to your project. 6 | 7 | [assembly: AssemblyTitle("TestApp")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("")] 12 | [assembly: AssemblyCopyright("${AuthorCopyright}")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". 17 | // The form "{Major}.{Minor}.*" will automatically update the build and revision, 18 | // and "{Major}.{Minor}.{Build}.*" will update just the revision. 19 | 20 | [assembly: AssemblyVersion("1.0.*")] 21 | 22 | // The following attributes are used to specify the signing key for the assembly, 23 | // if desired. See the Mono documentation for more information about signing. 24 | 25 | //[assembly: AssemblyDelaySign(false)] 26 | //[assembly: AssemblyKeyFile("")] 27 | 28 | -------------------------------------------------------------------------------- /TestApp/TestApp.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | AnyCPU 6 | {EFFB5754-9D8D-4014-A5A4-6BFFCFBA0F80} 7 | Exe 8 | TestApp 9 | TestApp 10 | v4.5 11 | 12 | 13 | true 14 | full 15 | false 16 | bin\Debug 17 | DEBUG; 18 | prompt 19 | 4 20 | true 21 | 22 | 23 | true 24 | bin\Release 25 | prompt 26 | 4 27 | true 28 | 29 | 30 | 31 | 32 | ..\packages\DotNetZip.1.10.1\lib\net20\DotNetZip.dll 33 | 34 | 35 | ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll 36 | 37 | 38 | ..\packages\OneScript.1.0.16\lib\net40\ScriptEngine.dll 39 | 40 | 41 | ..\packages\OneScript.StandardLibrary.1.0.16\lib\net40\ScriptEngine.HostedScript.dll 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | {EA173D06-CCD2-45D5-A263-DC866289517A} 51 | oscript-component 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /TestApp/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | version: 1.0.{build} 2 | environment: 3 | main_project: oscript-component 4 | before_build: 5 | - ps: nuget restore 6 | init: 7 | - ps: Set-WinSystemLocale ru-RU 8 | - ps: Start-Sleep -s 5 9 | - ps: Restart-Computer 10 | install: 11 | - cmd: >- 12 | mkdir engine 13 | 14 | cd engine 15 | 16 | appveyor DownloadFile http://oscript.io/downloads/latest/exe -FileName os.exe 17 | 18 | os.exe /silent 19 | 20 | set PATH=%ProgramFiles(x86)%\OneScript\bin;%PATH% 21 | 22 | cd .. 23 | 24 | appveyor DownloadFile https://github.com/dmpas/OneScriptDocumenter/releases/download/1.0.13/documenter.zip -FileName OneScriptDocumenter.zip 25 | 26 | 7z x OneScriptDocumenter.zip > NUL 27 | 28 | oscript -version 29 | 30 | opm install opm 31 | 32 | build: 33 | verbosity: minimal 34 | configuration: Release 35 | test_script: 36 | - cmd: nunit3-console --x86 NUnitTests\bin\%CONFIGURATION%\NUnitTests.dll 37 | 38 | after_build: 39 | - cmd: >- 40 | 41 | del %main_project%\bin\%CONFIGURATION%\*.pdb 42 | 43 | mkdir bin 44 | 45 | OneScriptDocumenter.exe json bin\syntaxHelp.json %main_project%\bin\%CONFIGURATION%\%main_project%.dll 46 | 47 | del %main_project%\bin\%CONFIGURATION%\ScriptEngine*.* %main_project%\bin\%CONFIGURATION%\NewtonSoft*.* %main_project%\bin\%CONFIGURATION%\DotNetZip*.* 48 | 49 | xcopy %main_project%\bin\%CONFIGURATION%\* bin\ 50 | 51 | opm build . 52 | 53 | artifacts: 54 | - path: .\*.ospx 55 | name: component 56 | -------------------------------------------------------------------------------- /docs/Reference.md: -------------------------------------------------------------------------------- 1 | 2 | # ВербальноеВыражение / VerbalExpression 3 | 4 | 5 | 6 | Класс предоставляет объектную модель для построения регулярных выражений. 7 | 8 | 9 | 10 | 11 | ## Методы 12 | 13 | ### ВРегулярноеВыражение / ToRegex() 14 | 15 | 16 | 17 | Преобразует объект в РегулярноеВыражение. 18 | 19 | 20 | 21 | 22 | #### Возвращаемое значение 23 | 24 | Объект РегулярноеВыражение с заполненным шаблоном поиска и флагами 25 | 26 | 27 | ### ВСтроку / ToString() 28 | 29 | 30 | 31 | Преобразует объект в строку. 32 | 33 | 34 | 35 | 36 | #### Возвращаемое значение 37 | 38 | Текст регулярного выражения в виде строки 39 | 40 | 41 | ### Найти / Find() 42 | 43 | 44 | 45 | Ищет в строке определенное значение. То же самое, что и `Затем()`. 46 | 47 | 48 | 49 | 50 | #### Параметры 51 | 52 | * *value*: Искомое значение 53 | 54 | * *sanitize*: Экранировать переданное значение 55 | 56 | #### Возвращаемое значение 57 | 58 | ВербальноеВыражение 59 | 60 | 61 | ### Затем / Then() 62 | 63 | 64 | 65 | Ищет в строке определенное значение. То же самое, что и `Найти()`. 66 | 67 | 68 | 69 | 70 | #### Параметры 71 | 72 | * *value*: Искомое значение 73 | 74 | * *sanitize*: Экранировать переданное значение 75 | 76 | #### Возвращаемое значение 77 | 78 | ВербальноеВыражение 79 | 80 | 81 | ### Либо / Or() 82 | 83 | 84 | 85 | Добавление условия ИЛИ в выражение. 86 | 87 | 88 | 89 | 90 | #### Параметры 91 | 92 | * *value*: Искомое значение 93 | 94 | * *sanitize*: Экранировать переданное значение 95 | 96 | #### Возвращаемое значение 97 | 98 | ВербальноеВыражение 99 | 100 | 101 | ### ЧтоУгодно / Anything() 102 | 103 | 104 | 105 | Поиск "чего угодно", в том числе отсутствия символов. 106 | 107 | 108 | 109 | 110 | #### Возвращаемое значение 111 | 112 | ВербальноеВыражение 113 | 114 | 115 | ### ЧтоУгодноНоНе / AnythingBut() 116 | 117 | 118 | 119 | Поиск "чего угодно, кроме" указанных символов, в том числе их отсутствие. 120 | 121 | 122 | 123 | 124 | #### Параметры 125 | 126 | * *value*: Искомое значение 127 | 128 | * *sanitize*: Экранировать переданное значение 129 | 130 | #### Возвращаемое значение 131 | 132 | ВербальноеВыражение 133 | 134 | 135 | ### ЧтоНибудь / Something() 136 | 137 | 138 | 139 | Поиск "чего-нибудь" - любого символа хотя бы один раз. 140 | 141 | 142 | 143 | 144 | #### Возвращаемое значение 145 | 146 | ВербальноеВыражение 147 | 148 | 149 | ### ЧтоНибудьНоНе / SomethingBut() 150 | 151 | 152 | 153 | Поиск "чего-нибудь, кроме" указанных символов хотя бы один раз. 154 | 155 | 156 | 157 | 158 | #### Параметры 159 | 160 | * *value*: Искомое значение 161 | 162 | * *sanitize*: Экранировать переданное значение 163 | 164 | #### Возвращаемое значение 165 | 166 | ВербальноеВыражение 167 | 168 | 169 | ### МожетБыть / Maybe() 170 | 171 | 172 | 173 | Поиск необязательного значения. 174 | 175 | 176 | 177 | 178 | #### Параметры 179 | 180 | * *value*: Искомое значение 181 | 182 | * *sanitize*: Экранировать переданное значение 183 | 184 | #### Возвращаемое значение 185 | 186 | ВербальноеВыражение 187 | 188 | 189 | ### НачалоСтроки / StartOfLine() 190 | 191 | 192 | 193 | Добавляет в поиск префикс "начала строки". 194 | 195 | 196 | 197 | 198 | #### Возвращаемое значение 199 | 200 | ВербальноеВыражение 201 | 202 | 203 | ### КонецСтроки / EndOfLine() 204 | 205 | 206 | 207 | Добавляет в поиск суффикс "конца строки". 208 | 209 | 210 | 211 | 212 | #### Возвращаемое значение 213 | 214 | ВербальноеВыражение 215 | 216 | 217 | ### ПереводСтроки / LineBreak() 218 | 219 | 220 | 221 | Перевод строки. 222 | 223 | 224 | 225 | 226 | #### Возвращаемое значение 227 | 228 | ВербальноеВыражение 229 | 230 | 231 | ### ПС / LF() 232 | 233 | 234 | 235 | Перевод строки. 236 | 237 | 238 | 239 | 240 | #### Возвращаемое значение 241 | 242 | ВербальноеВыражение 243 | 244 | 245 | ### Отступ / Tab() 246 | 247 | 248 | 249 | Символ табуляции. 250 | 251 | 252 | 253 | 254 | #### Возвращаемое значение 255 | 256 | ВербальноеВыражение 257 | 258 | 259 | ### Слово / Word() 260 | 261 | 262 | 263 | Буквенно-цифровая последовательность символов. 264 | 265 | 266 | 267 | 268 | #### Возвращаемое значение 269 | 270 | ВербальноеВыражение 271 | 272 | 273 | ### Число / Digit() 274 | 275 | 276 | 277 | Любое число. 278 | 279 | 280 | 281 | 282 | #### Возвращаемое значение 283 | 284 | ВербальноеВыражение 285 | 286 | 287 | ### ПробельныйСимвол / Whitespace() 288 | 289 | 290 | 291 | Любой пробельный символ. 292 | 293 | 294 | 295 | 296 | #### Возвращаемое значение 297 | 298 | ВербальноеВыражение 299 | 300 | 301 | ### Диапазон / Range() 302 | 303 | 304 | 305 | Диапазон символов. 306 | 307 | 308 | 309 | 310 | #### Параметры 311 | 312 | * *from*: Нижняя граница диапазона 313 | 314 | * *to*: Верхняя граница диапазона 315 | 316 | #### Возвращаемое значение 317 | 318 | ВербальноеВыражение 319 | 320 | 321 | ### Любой / Any() 322 | 323 | 324 | 325 | Любой из указанных символов. То же самое, что и `ЛюбойИз()` 326 | 327 | 328 | 329 | 330 | #### Параметры 331 | 332 | * *value*: Искомое значение 333 | 334 | #### Возвращаемое значение 335 | 336 | ВербальноеВыражение 337 | 338 | 339 | ### ЛюбойИз / AnyOf() 340 | 341 | 342 | 343 | Любой из указанных символов. То же самое, что и `Любой()` 344 | 345 | 346 | 347 | 348 | #### Параметры 349 | 350 | * *value*: Искомое значение 351 | 352 | #### Возвращаемое значение 353 | 354 | ВербальноеВыражение 355 | 356 | 357 | ### ОдинИлиБольше / OneOrMore() 358 | 359 | 360 | 361 | Поиск "одного или более". 362 | Если передан параметр `value`, то мультипликатор применяется к нему. 363 | Если параметр `value` не передан, то мультипликатор применяется к предыдущей группе регулярного выражения. 364 | 365 | 366 | 367 | 368 | #### Параметры 369 | 370 | * *value*: Искомое значение 371 | 372 | * *sanitize*: Экранировать переданное значение 373 | 374 | #### Возвращаемое значение 375 | 376 | ВербальноеВыражение 377 | 378 | 379 | ### НачатьЗахват / BeginCapture() 380 | 381 | 382 | 383 | Начать захват группы. 384 | 385 | 386 | 387 | 388 | #### Параметры 389 | 390 | * *groupName*: Имя группы 391 | 392 | #### Возвращаемое значение 393 | 394 | ВербальноеВыражение 395 | 396 | 397 | ### ЗакончитьЗахват / EndCapture() 398 | 399 | 400 | 401 | Закончить захват группы. 402 | 403 | 404 | 405 | 406 | #### Возвращаемое значение 407 | 408 | ВербальноеВыражение 409 | 410 | 411 | ### ПовторитьПредыдущее / RepeatPrevious() 412 | 413 | 414 | 415 | Повторить предыдущую группу поиска n раз. 416 | 417 | 418 | 419 | 420 | #### Параметры 421 | 422 | * *n*: Число повторений 423 | 424 | #### Возвращаемое значение 425 | 426 | ВербальноеВыражение 427 | 428 | 429 | ### ПовторитьПредыдущееОтИДо / RepeatPreviousFromAndTo() 430 | 431 | 432 | 433 | Повторить предыдущую группу поиска от n до m раз. 434 | 435 | 436 | 437 | 438 | #### Параметры 439 | 440 | * *n*: Нижняя гранница 441 | 442 | * *m*: Верхняя граница 443 | 444 | #### Возвращаемое значение 445 | 446 | ВербальноеВыражение 447 | 448 | 449 | ### СЛюбымРегистром / WithAnyCase() 450 | 451 | 452 | 453 | Включить поиск без учета регистра символов. 454 | 455 | 456 | 457 | 458 | #### Параметры 459 | 460 | * *enable*: Флаг включения/выключения поиска 461 | 462 | #### Возвращаемое значение 463 | 464 | ВербальноеВыражение 465 | 466 | 467 | ### ОднострочныйПоиск / SearchOneLine() 468 | 469 | 470 | 471 | Включить поиск только по одной строке. 472 | 473 | 474 | 475 | 476 | #### Параметры 477 | 478 | * *enable*: Флаг включения/выключения поиска 479 | 480 | #### Возвращаемое значение 481 | 482 | ВербальноеВыражение 483 | 484 | 485 | ### ДобавитьМодификатор / AddModifier() 486 | 487 | 488 | 489 | Добавление модификатора регулярного выражения. 490 | Допустимые значения: i, m. 491 | 492 | 493 | 494 | 495 | #### Параметры 496 | 497 | * *modifier*: Устанавливаемый модификатор 498 | 499 | #### Возвращаемое значение 500 | 501 | ВербальноеВыражение 502 | 503 | 504 | ### УдалитьМодификатор / RemoveModifier() 505 | 506 | 507 | 508 | Удаление модификатора регулярного выражения. 509 | Допустимые значения: i, m. 510 | 511 | 512 | 513 | 514 | #### Параметры 515 | 516 | * *modifier*: Удаляемый модификатор 517 | 518 | #### Возвращаемое значение 519 | 520 | ВербальноеВыражение 521 | 522 | 523 | ### Добавить / Add() 524 | 525 | 526 | 527 | Добавление произвольного текста в регулярное выражение. 528 | 529 | 530 | 531 | 532 | #### Параметры 533 | 534 | * *value*: Добавляемый текст 535 | 536 | * *sanitize*: Экранировать переданное значение 537 | 538 | #### Возвращаемое значение 539 | 540 | ВербальноеВыражение 541 | 542 | 543 | ### Экранировать / Sanitize() 544 | 545 | 546 | 547 | Экранирование управляющих символов регулярного выражения в переданной строке. 548 | 549 | 550 | 551 | 552 | #### Параметры 553 | 554 | * *value*: Экранируемая строка 555 | 556 | #### Возвращаемое значение 557 | 558 | Экранированная строка 559 | 560 | 561 | ## Конструкторы 562 | 563 | 564 | ### По умолчанию 565 | 566 | 567 | Конструктор Вербального выражения. 568 | 569 | 570 | 571 | 572 | -------------------------------------------------------------------------------- /oscript-component.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2012 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "oscript-component", "oscript-component\oscript-component.csproj", "{EA173D06-CCD2-45D5-A263-DC866289517A}" 5 | EndProject 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestApp", "TestApp\TestApp.csproj", "{EFFB5754-9D8D-4014-A5A4-6BFFCFBA0F80}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NUnitTests", "NUnitTests\NUnitTests.csproj", "{9A739C32-D551-43B0-920A-D9C53367BC38}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Release|Any CPU = Release|Any CPU 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {EA173D06-CCD2-45D5-A263-DC866289517A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {EA173D06-CCD2-45D5-A263-DC866289517A}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {EA173D06-CCD2-45D5-A263-DC866289517A}.Release|Any CPU.ActiveCfg = Release|Any CPU 19 | {EA173D06-CCD2-45D5-A263-DC866289517A}.Release|Any CPU.Build.0 = Release|Any CPU 20 | {EFFB5754-9D8D-4014-A5A4-6BFFCFBA0F80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {EFFB5754-9D8D-4014-A5A4-6BFFCFBA0F80}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {EFFB5754-9D8D-4014-A5A4-6BFFCFBA0F80}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {EFFB5754-9D8D-4014-A5A4-6BFFCFBA0F80}.Release|Any CPU.Build.0 = Release|Any CPU 24 | {9A739C32-D551-43B0-920A-D9C53367BC38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 25 | {9A739C32-D551-43B0-920A-D9C53367BC38}.Debug|Any CPU.Build.0 = Debug|Any CPU 26 | {9A739C32-D551-43B0-920A-D9C53367BC38}.Release|Any CPU.ActiveCfg = Release|Any CPU 27 | {9A739C32-D551-43B0-920A-D9C53367BC38}.Release|Any CPU.Build.0 = Release|Any CPU 28 | EndGlobalSection 29 | EndGlobal 30 | -------------------------------------------------------------------------------- /oscript-component/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | 4 | // Information about this assembly is defined by the following attributes. 5 | // Change them to the values specific to your project. 6 | 7 | [assembly: AssemblyTitle("oscript-verbal-expressions")] 8 | [assembly: AssemblyDescription("OneScript Verbal Expressions")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("")] 12 | [assembly: AssemblyCopyright("nixel2007")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". 17 | // The form "{Major}.{Minor}.*" will automatically update the build and revision, 18 | // and "{Major}.{Minor}.{Build}.*" will update just the revision. 19 | 20 | [assembly: AssemblyVersion("1.0.*")] 21 | 22 | // The following attributes are used to specify the signing key for the assembly, 23 | // if desired. See the Mono documentation for more information about signing. 24 | 25 | //[assembly: AssemblyDelaySign(false)] 26 | //[assembly: AssemblyKeyFile("")] 27 | 28 | -------------------------------------------------------------------------------- /oscript-component/VerbalExpression.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Reflection; 3 | using System.Text.RegularExpressions; 4 | using CSharpVerbalExpressions; 5 | using ScriptEngine.Machine.Contexts; 6 | using ScriptEngine.Machine; 7 | 8 | namespace OnescriptVerbalExpressions 9 | { 10 | /// 11 | /// Класс предоставляет объектную модель для построения регулярных выражений. 12 | /// 13 | [ContextClass("ВербальноеВыражение", "VerbalExpression")] 14 | public class VerbalExpression : AutoContext 15 | { 16 | private readonly VerbalExpressions _verbalExpression = new VerbalExpressions(); 17 | private RegexOptions _modifiers = RegexOptions.IgnoreCase | RegexOptions.Multiline; 18 | 19 | #region Terminals 20 | 21 | /// 22 | /// Преобразует объект в РегулярноеВыражение. 23 | /// 24 | /// Объект РегулярноеВыражение с заполненным шаблоном поиска и флагами 25 | /// 26 | [ContextMethod("ВРегулярноеВыражение")] 27 | public IRuntimeContextInstance ToRegex() 28 | { 29 | var regexString = ToStringImpl(); 30 | var oscriptRegExpType = Assembly.Load("ScriptEngine.HostedScript") 31 | .GetType("ScriptEngine.HostedScript.Library.Regex.RegExpImpl"); 32 | var methodInfo = oscriptRegExpType.GetMethod("Constructor"); 33 | if (methodInfo == null) 34 | { 35 | throw new TypeLoadException(); 36 | } 37 | 38 | var oscriptRegExpImpl = (IRuntimeContextInstance) methodInfo.Invoke( 39 | null, 40 | new object[] {ValueFactory.Create(regexString)} 41 | ); 42 | 43 | var propertyMultiline = oscriptRegExpImpl.FindProperty("Multiline"); 44 | var valueMultiline = _modifiers.HasFlag(RegexOptions.Multiline); 45 | oscriptRegExpImpl.SetPropValue(propertyMultiline, ValueFactory.Create(valueMultiline)); 46 | 47 | var propertyIgnoreCase = oscriptRegExpImpl.FindProperty("IgnoreCase"); 48 | var valueIgnoreCase = _modifiers.HasFlag(RegexOptions.IgnoreCase); 49 | oscriptRegExpImpl.SetPropValue(propertyIgnoreCase, ValueFactory.Create(valueIgnoreCase)); 50 | 51 | return oscriptRegExpImpl; 52 | 53 | } 54 | 55 | /// 56 | /// Преобразует объект в строку. 57 | /// 58 | /// Текст регулярного выражения в виде строки 59 | [ContextMethod("ВСтроку", "ToString")] 60 | public string ToStringImpl() 61 | { 62 | return _verbalExpression.ToString(); 63 | } 64 | 65 | #endregion 66 | 67 | #region Modifiers 68 | 69 | /// 70 | /// Ищет в строке определенное значение. То же самое, что и `Затем()`. 71 | /// 72 | /// Искомое значение 73 | /// Экранировать переданное значение 74 | /// ВербальноеВыражение 75 | [ContextMethod("Найти")] 76 | public VerbalExpression Find(string value, bool sanitize = true) 77 | { 78 | return Then(value, sanitize); 79 | } 80 | 81 | /// 82 | /// Ищет в строке определенное значение. То же самое, что и `Найти()`. 83 | /// 84 | /// Искомое значение 85 | /// Экранировать переданное значение 86 | /// ВербальноеВыражение 87 | [ContextMethod("Затем")] 88 | public VerbalExpression Then(string value, bool sanitize = true) 89 | { 90 | _verbalExpression.Then(value, sanitize); 91 | return this; 92 | } 93 | 94 | /// 95 | /// Добавление условия ИЛИ в выражение. 96 | /// 97 | /// Искомое значение 98 | /// Экранировать переданное значение 99 | /// ВербальноеВыражение 100 | [ContextMethod("Либо")] 101 | public VerbalExpression Or(string value, bool sanitize = true) 102 | { 103 | _verbalExpression.Or(value, sanitize); 104 | return this; 105 | } 106 | 107 | /// 108 | /// Поиск "чего угодно", в том числе отсутствия символов. 109 | /// 110 | /// ВербальноеВыражение 111 | [ContextMethod("ЧтоУгодно")] 112 | public VerbalExpression Anything() 113 | { 114 | _verbalExpression.Anything(); 115 | return this; 116 | } 117 | 118 | /// 119 | /// Поиск "чего угодно, кроме" указанных символов, в том числе их отсутствие. 120 | /// 121 | /// Искомое значение 122 | /// Экранировать переданное значение 123 | /// ВербальноеВыражение 124 | [ContextMethod("ЧтоУгодноНоНе")] 125 | public VerbalExpression AnythingBut(string value, bool sanitize = true) 126 | { 127 | _verbalExpression.AnythingBut(value, sanitize); 128 | return this; 129 | } 130 | 131 | /// 132 | /// Поиск "чего-нибудь" - любого символа хотя бы один раз. 133 | /// 134 | /// ВербальноеВыражение 135 | [ContextMethod("ЧтоНибудь")] 136 | public VerbalExpression Something() 137 | { 138 | _verbalExpression.Something(); 139 | return this; 140 | } 141 | 142 | /// 143 | /// Поиск "чего-нибудь, кроме" указанных символов хотя бы один раз. 144 | /// 145 | /// Искомое значение 146 | /// Экранировать переданное значение 147 | /// ВербальноеВыражение 148 | [ContextMethod("ЧтоНибудьНоНе")] 149 | public VerbalExpression SomethingBut(string value, bool sanitize = true) 150 | { 151 | _verbalExpression.SomethingBut(value, sanitize); 152 | return this; 153 | } 154 | 155 | /// 156 | /// Поиск необязательного значения. 157 | /// 158 | /// Искомое значение 159 | /// Экранировать переданное значение 160 | /// ВербальноеВыражение 161 | [ContextMethod("МожетБыть")] 162 | public VerbalExpression Maybe(string value, bool sanitize = true) 163 | { 164 | _verbalExpression.Maybe(value, sanitize); 165 | return this; 166 | } 167 | 168 | /// 169 | /// Добавляет в поиск префикс "начала строки". 170 | /// 171 | /// ВербальноеВыражение 172 | [ContextMethod("НачалоСтроки")] 173 | public VerbalExpression StartOfLine() 174 | { 175 | _verbalExpression.StartOfLine(); 176 | return this; 177 | } 178 | 179 | /// 180 | /// Добавляет в поиск суффикс "конца строки". 181 | /// 182 | /// ВербальноеВыражение 183 | [ContextMethod("КонецСтроки")] 184 | public VerbalExpression EndOfLine() 185 | { 186 | _verbalExpression.EndOfLine(); 187 | return this; 188 | } 189 | 190 | #endregion 191 | 192 | #region Special characters and groups 193 | 194 | /// 195 | /// Перевод строки. 196 | /// 197 | /// ВербальноеВыражение 198 | [ContextMethod("ПереводСтроки")] 199 | public VerbalExpression LineBreak() 200 | { 201 | _verbalExpression.LineBreak(); 202 | return this; 203 | } 204 | 205 | /// 206 | /// Перевод строки. 207 | /// 208 | /// ВербальноеВыражение 209 | [ContextMethod("ПС")] 210 | public VerbalExpression LF() 211 | { 212 | _verbalExpression.Br(); 213 | return this; 214 | } 215 | 216 | /// 217 | /// Символ табуляции. 218 | /// 219 | /// ВербальноеВыражение 220 | [ContextMethod("Отступ")] 221 | public VerbalExpression Tab() 222 | { 223 | _verbalExpression.Tab(); 224 | return this; 225 | } 226 | 227 | /// 228 | /// Буквенно-цифровая последовательность символов. 229 | /// 230 | /// ВербальноеВыражение 231 | [ContextMethod("Слово")] 232 | public VerbalExpression Word() 233 | { 234 | _verbalExpression.Word(); 235 | return this; 236 | } 237 | 238 | /// 239 | /// Любое число. 240 | /// 241 | /// ВербальноеВыражение 242 | [ContextMethod("Число")] 243 | public VerbalExpression Digit() 244 | { 245 | _verbalExpression.Add("\\d", false); 246 | return this; 247 | } 248 | 249 | /// 250 | /// Любой пробельный символ. 251 | /// 252 | /// ВербальноеВыражение 253 | [ContextMethod("ПробельныйСимвол")] 254 | public VerbalExpression Whitespace() 255 | { 256 | _verbalExpression.Add("\\s", false); 257 | return this; 258 | } 259 | 260 | /// 261 | /// Диапазон символов. 262 | /// 263 | /// Нижняя граница диапазона 264 | /// Верхняя граница диапазона 265 | /// ВербальноеВыражение 266 | [ContextMethod("Диапазон")] 267 | public VerbalExpression Range(string from, string to) 268 | { 269 | _verbalExpression.Range(from, to); 270 | return this; 271 | } 272 | 273 | /// 274 | /// Любой из указанных символов. То же самое, что и `ЛюбойИз()` 275 | /// 276 | /// Искомое значение 277 | /// ВербальноеВыражение 278 | [ContextMethod("Любой")] 279 | public VerbalExpression Any(string value) 280 | { 281 | _verbalExpression.Any(value); 282 | return this; 283 | } 284 | 285 | /// 286 | /// Любой из указанных символов. То же самое, что и `Любой()` 287 | /// 288 | /// Искомое значение 289 | /// ВербальноеВыражение 290 | [ContextMethod("ЛюбойИз")] 291 | public VerbalExpression AnyOf(string value) 292 | { 293 | _verbalExpression.AnyOf(value); 294 | return this; 295 | } 296 | 297 | /// 298 | /// Поиск "одного или более". 299 | /// Если передан параметр `value`, то мультипликатор применяется к нему. 300 | /// Если параметр `value` не передан, то мультипликатор применяется к предыдущей группе регулярного выражения. 301 | /// 302 | /// Искомое значение 303 | /// Экранировать переданное значение 304 | /// ВербальноеВыражение 305 | [ContextMethod("ОдинИлиБольше")] 306 | public VerbalExpression OneOrMore(string value = "", bool sanitize = true) 307 | { 308 | if (string.IsNullOrEmpty(value)) 309 | { 310 | _verbalExpression.Add("+", false); 311 | } 312 | else 313 | { 314 | _verbalExpression.Multiple(value, sanitize); 315 | } 316 | return this; 317 | } 318 | 319 | /// 320 | /// Начать захват группы. 321 | /// 322 | /// Имя группы 323 | /// ВербальноеВыражение 324 | [ContextMethod("НачатьЗахват")] 325 | public VerbalExpression BeginCapture(string groupName = "") 326 | { 327 | if (string.IsNullOrEmpty(groupName)) 328 | { 329 | _verbalExpression.BeginCapture(); 330 | } 331 | else 332 | { 333 | _verbalExpression.BeginCapture(groupName); 334 | } 335 | return this; 336 | } 337 | 338 | /// 339 | /// Закончить захват группы. 340 | /// 341 | /// ВербальноеВыражение 342 | [ContextMethod("ЗакончитьЗахват")] 343 | public VerbalExpression EndCapture() 344 | { 345 | _verbalExpression.EndCapture(); 346 | return this; 347 | } 348 | 349 | /// 350 | /// Повторить предыдущую группу поиска n раз. 351 | /// 352 | /// Число повторений 353 | /// ВербальноеВыражение 354 | [ContextMethod("ПовторитьПредыдущее")] 355 | public VerbalExpression RepeatPrevious(int n) 356 | { 357 | _verbalExpression.RepeatPrevious(n); 358 | return this; 359 | } 360 | 361 | /// 362 | /// Повторить предыдущую группу поиска от n до m раз. 363 | /// 364 | /// Нижняя гранница 365 | /// Верхняя граница 366 | /// ВербальноеВыражение 367 | [ContextMethod("ПовторитьПредыдущееОтИДо")] 368 | public VerbalExpression RepeatPreviousFromAndTo(int n, int m) 369 | { 370 | _verbalExpression.RepeatPrevious(n, m); 371 | return this; 372 | } 373 | 374 | #endregion 375 | 376 | #region RegExp options 377 | 378 | /// 379 | /// Включить поиск без учета регистра символов. 380 | /// 381 | /// Флаг включения/выключения поиска 382 | /// ВербальноеВыражение 383 | [ContextMethod("СЛюбымРегистром")] 384 | public VerbalExpression WithAnyCase(bool enable) 385 | { 386 | if (enable) 387 | { 388 | AddModifier("i"); 389 | } 390 | else 391 | { 392 | RemoveModifier("i"); 393 | } 394 | _verbalExpression.WithAnyCase(enable); 395 | return this; 396 | } 397 | 398 | /// 399 | /// Включить поиск только по одной строке. 400 | /// 401 | /// Флаг включения/выключения поиска 402 | /// ВербальноеВыражение 403 | [ContextMethod("ОднострочныйПоиск")] 404 | public VerbalExpression SearchOneLine(bool enable) 405 | { 406 | if (enable) 407 | { 408 | RemoveModifier("m"); 409 | } 410 | else 411 | { 412 | AddModifier("m"); 413 | } 414 | _verbalExpression.UseOneLineSearchOption(enable); 415 | return this; 416 | } 417 | 418 | /// 419 | /// Добавление модификатора регулярного выражения. 420 | /// Допустимые значения: i, m. 421 | /// 422 | /// Устанавливаемый модификатор 423 | /// ВербальноеВыражение 424 | [ContextMethod("ДобавитьМодификатор")] 425 | public VerbalExpression AddModifier(string modifier) 426 | { 427 | switch (modifier) 428 | { 429 | case "i": 430 | _modifiers |= RegexOptions.IgnoreCase; 431 | break; 432 | case "m": 433 | _modifiers |= RegexOptions.Multiline; 434 | break; 435 | case "s": 436 | _modifiers |= RegexOptions.Singleline; 437 | break; 438 | case "x": 439 | _modifiers |= RegexOptions.IgnorePatternWhitespace; 440 | break; 441 | } 442 | 443 | _verbalExpression.AddModifier(modifier.ToCharArray(0, 1)[0]); 444 | return this; 445 | } 446 | 447 | /// 448 | /// Удаление модификатора регулярного выражения. 449 | /// Допустимые значения: i, m. 450 | /// 451 | /// Удаляемый модификатор 452 | /// ВербальноеВыражение 453 | [ContextMethod("УдалитьМодификатор")] 454 | public VerbalExpression RemoveModifier(string modifier) 455 | { 456 | switch (modifier) 457 | { 458 | case "i": 459 | _modifiers &= ~RegexOptions.IgnoreCase; 460 | break; 461 | case "m": 462 | _modifiers &= ~RegexOptions.Multiline; 463 | break; 464 | case "s": 465 | _modifiers &= ~RegexOptions.Singleline; 466 | break; 467 | case "x": 468 | _modifiers &= ~RegexOptions.IgnorePatternWhitespace; 469 | break; 470 | } 471 | 472 | _verbalExpression.RemoveModifier(modifier.ToCharArray(0, 1)[0]); 473 | return this; 474 | } 475 | #endregion 476 | 477 | #region Other 478 | 479 | /// 480 | /// Добавление произвольного текста в регулярное выражение. 481 | /// 482 | /// Добавляемый текст 483 | /// Экранировать переданное значение 484 | /// ВербальноеВыражение 485 | [ContextMethod("Добавить")] 486 | public VerbalExpression Add(string value, bool sanitize = true) 487 | { 488 | _verbalExpression.Add(value, sanitize); 489 | return this; 490 | } 491 | 492 | /// 493 | /// Экранирование управляющих символов регулярного выражения в переданной строке. 494 | /// 495 | /// Экранируемая строка 496 | /// Экранированная строка 497 | [ContextMethod("Экранировать")] 498 | public string Sanitize(string value) 499 | { 500 | return _verbalExpression.Sanitize(value); 501 | } 502 | 503 | #endregion 504 | 505 | /// 506 | /// Конструктор Вербального выражения. 507 | /// 508 | /// ВербальноеВыражение 509 | [ScriptConstructor] 510 | public static VerbalExpression Constructor() 511 | { 512 | return new VerbalExpression(); 513 | } 514 | } 515 | } 516 | 517 | -------------------------------------------------------------------------------- /oscript-component/oscript-component.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Debug 5 | AnyCPU 6 | {EA173D06-CCD2-45D5-A263-DC866289517A} 7 | Library 8 | oscriptcomponent 9 | oscript-component 10 | v4.5 11 | 12 | 13 | true 14 | full 15 | false 16 | bin\Debug 17 | DEBUG; 18 | prompt 19 | 4 20 | bin\Debug\oscript-component.xml 21 | false 22 | 23 | 24 | full 25 | true 26 | bin\Release 27 | prompt 28 | 4 29 | bin\Debug\oscript-component.xml 30 | false 31 | 32 | 33 | 34 | 35 | ..\packages\DotNetZip.1.10.1\lib\net20\DotNetZip.dll 36 | 37 | 38 | ..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll 39 | 40 | 41 | ..\packages\OneScript.1.0.16\lib\net40\ScriptEngine.dll 42 | 43 | 44 | ..\packages\OneScript.StandardLibrary.1.0.16\lib\net40\ScriptEngine.HostedScript.dll 45 | 46 | 47 | ..\packages\VerbalExpressions-official.0.1.0\lib\net40\VerbalExpressions.dll 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /oscript-component/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /package-loader.os: -------------------------------------------------------------------------------- 1 | Процедура ПриЗагрузкеБиблиотеки(Знач КаталогБиблиотеки, СтандартнаяОбработка, Отказ) 2 | 3 | СтандартнаяОбработка = Ложь; 4 | Отказ = Ложь; 5 | 6 | // Тут нужно подключать каждую библиотеку. 7 | // Желательно в порядке разрешения зависимостей: 8 | // чтобы зависимость была загружена ранее зависимой библиотеки 9 | 10 | ПодключитьВнешнююКомпоненту(ОбъединитьПути(КаталогБиблиотеки, "bin", "oscript-component.dll")); 11 | 12 | КонецПроцедуры 13 | 14 | -------------------------------------------------------------------------------- /packagedef: -------------------------------------------------------------------------------- 1 | Описание 2 | .Имя("verbal-expressions") 3 | .Версия("1.0.0") 4 | .Автор("Nikita Gryzlov") 5 | .АдресАвтора("nixel2007@gmail.com") 6 | .Описание("Регулярные выражения - это просто!") 7 | 8 | .ВерсияСреды("1.0.16") 9 | 10 | .ВключитьФайл("lib.config") 11 | // Сюда будут складываться компоненты (см. appveyor.yml) 12 | .ВключитьФайл("bin") 13 | // Это файл автозагрузки, который подгружает компоненты из библиотеки 14 | .ВключитьФайл("package-loader.os") 15 | 16 | .ВключитьФайл("README.md") 17 | ; 18 | 19 | // vim: filetype=onescript 20 | -------------------------------------------------------------------------------- /testcomponent.os: -------------------------------------------------------------------------------- 1 | ПодключитьВнешнююКомпоненту("oscript-component/bin/Debug/oscript-component.dll"); 2 | 3 | Слагаемое1 = Новый Слагаемое(5); 4 | Слагаемое2 = Новый Слагаемое(Слагаемое1); 5 | 6 | Сообщить("Слагаемое1 = " + Слагаемое1); 7 | Сообщить("Слагаемое2 = " + Слагаемое2); 8 | 9 | Складыватель = Новый Сложение; 10 | Складыватель.ДобавитьСлагаемое(Слагаемое1); 11 | Складыватель.ДобавитьСлагаемое(Слагаемое2); 12 | Складыватель.ДобавитьСлагаемое(8); 13 | 14 | Сумма = Складыватель.Вычислить(); 15 | 16 | Сообщить("Получилось: " + Сумма); 17 | 18 | Складыватель2 = Новый Сложение(1, 2); 19 | Сообщить("Конструктор 2: " + Складыватель2.Вычислить()); 20 | 21 | Складыватель3 = Новый Сложение(Складыватель); 22 | Сообщить("Конструктор 3: " + Складыватель3.Вычислить()); 23 | --------------------------------------------------------------------------------