<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; JScript: поиск и замена текста по регулярным выражениям]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=853&amp;type=atom" />
	<updated>2007-11-19T04:43:55Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=853</id>
		<entry>
			<title type="html"><![CDATA[JScript: поиск и замена текста по регулярным выражениям]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=6110#p6110" />
			<content type="html"><![CDATA[<p>Фильтр текста по регулярным выражениям (регэкспам). Работать с ним только через cscript.exe.</p><p>Обрабатывает переданный по конвейеру текст заданным регулярным выражением и<br />выводит в выходной поток.</p><p>Может следующее:<br />	- вывести список подстрок, совпадающих с регулярным выражением.<br />	- вывести текст, удалив текст, совпадающий с регулярным выражением (ключ &quot;r&quot;)<br />	- вывести текст, заменив текст, совпадающий с регулярным выражением<br />	на свой текст (ключ &quot;r&quot;) Поддерживаются переменные замены (match variables).</p><p>cscript.exe strfilt.js &lt;/регулярное выражение/[ключи]&gt; [замена]</p><p>Помимо стандартных ключей WSH (i,m,g) введен новый ключ &quot;r&quot;. Он указывает,<br />учитывать ли строку замены<br />Регулярное выражение или строка замены заключаются в кавычки, если в них есть пробелы.<br />Примеры:<br /></p><div class="quotebox"><blockquote><p>echo 001234-5699 | cscript.exe strfilt.js &quot;/(\d{4})\-(\d{2})/igr&quot; &quot;$2 = $1&quot;<br />echo 001234-5699 | cscript.exe strfilt.js &quot;/(\d{4})/i&quot;<br />echo 001234-5699 | cscript.exe strfilt.js &quot;/(\d{4})/ig&quot;</p></blockquote></div><p>Полное описание синтаксиса регулярных выражений можно найти в документации Microsoft по WSH:<br /><a href="http://download.microsoft.com/download/9/1/d/91dfd1b3-a274-4e17-a376-f605ff39c58c/script56.chm">http://download.microsoft.com/download/ … ript56.chm</a></p><p>Этот же хелп выдается, если запустить скрипт без параметров.</p><p>Я этот скрипт использую в EditPlus - там есть возможность обрабатывать открытый файл с помощью текстовых фильтров - утилит, которые принимают текст по конвейеру и выводят результат в stdout.</p><div class="codebox"><pre><code>try {
   var WSH = new ActiveXObject (&#039;WScript.Shell&#039;);
   var Arg = WScript.Arguments;
   var reg = new RegExp(&#039;.&#039;, &#039;&#039;);
   var input = &#039;&#039;;
   var repl  = &#039;&#039;;
   var sr    = &#039;&#039;;

// Если скрипт запущен через WScript, ругаемся и выходим
if (WScript.FullName.toLowerCase() == (WScript.Path+&#039;\\wscript.exe&#039;).toLowerCase()) {
      WSH.Popup(&#039;Запуск сценария производится только через &#039;+WScript.Path+&#039;\\cscript.exe.\n\nВыходим...&#039;, 0, &#039;Ошибка&#039;, 16);
      WScript.Quit();
}

if (Arg.length == 0) {
      WScript.StdOut.WriteLine(
         &#039;Фильтр текста по регулярным выражениям (регэкспам)\n\n&#039;+
         &#039;Обрабатывает переданный по конвейеру текст заданным регулярным выражением и\nвыводит в выходной поток.\n\n&#039;+
         &#039;Может следующее:\n&#039;+
         &#039;\t- вывести список подстрок, совпадающих с регулярным выражением.\n&#039;+
         &#039;\t- вывести текст, удалив текст, совпадающий с регулярным выражением (ключ &quot;r&quot;)\n&#039;+
         &#039;\t- вывести текст, заменив текст, совпадающий с регулярным выражением\n\tна свой текст (ключ &quot;r&quot;) Поддерживаются переменные замены (match variables).\n\n&#039;+
         &#039;cscript.exe &#039;+WScript.ScriptName+&#039; &lt;/регулярное выражение/[ключи]&gt; [замена]\n\n&#039;+
         &#039;Помимо стандартных ключей WSH (i,m,g) введен новый ключ &quot;r&quot;. Он указывает,\nучитывать ли строку замены\n&#039;+
         &#039;Регулярное выражение или строка замены заключаются в кавычки, если в них есть пробелы.\n&#039;+
         &#039;Примеры:\n\n&#039;+
         &#039;echo 001234-5699 | cscript.exe &#039;+WScript.ScriptName+&#039; &quot;/(\\d{4})\\-(\\d{2})/igr&quot; &quot;$2 = $1&quot;\n&#039;+
         &#039;echo 001234-5699 | cscript.exe &#039;+WScript.ScriptName+&#039; &quot;/(\\d{4})/i&quot;\n&#039;+
         &#039;echo 001234-5699 | cscript.exe &#039;+WScript.ScriptName+&#039; &quot;/(\\d{4})/ig&quot;\n\n&#039;+
         &#039;Полное описание синтаксиса регулярных выражений можно найти в документации Microsoft по WSH:\nhttp://download.microsoft.com/download/9/1/d/91dfd1b3-a274-4e17-a376-f605ff39c58c/script56.chm&#039;);
      WScript.Quit();
   }

   // из входных параметров вычленяем регулярное выражение, ключи к нему и строку замены (если указана)
   var re = Arg(0).match(/\/(.+)\/([imgr]{1,4})?/i)
   if (re) {
      // стандартные флаги Regexp Object - g (global) i (ignorecase) m (multiline)
      // вводим свой флаг - &quot;r&quot; (учитывать строку замены)
      var toRepl = (Arg.length&gt;=2)?( Arg(1) ):(&#039;&#039;); // строка замены для ключа &quot;r&quot;
      var isRepl = (re[2].search(&#039;r&#039;) &gt;= 0);  // заменить найденное в тексте на содержимое третьего параметра.
                                               // Если третий параметр не указан, это равноценно удалению найденного
      var isBlk  = (re[2].search(&#039;m&#039;) &lt; 0);   // искать не построчно а во всем тексте сразу
      var isGlob = (re[2].search(&#039;g&#039;) &gt;= 0);  // g - глобальная замена

      re[2] = re[2].replace(/r/ig,&#039;&#039;)+&#039;&#039;; // поскольку наш ключ самопальный, выкидываем его, а то WSH им подавится

      reg.compile(re[1], re[2]); // Compiles a regular expression into an internal format for faster execution.
   } else {
      WSH.Popup(&quot;Регулярное выражение записано с ошибкой&quot;,0,&#039;Ошибка выполнения&#039;,16+0);
      WScript.Quit();
   }

   if (isBlk){
      // обрабатывать весь текст одновременно
      while (!WScript.StdIn.AtEndOfStream) {
         input += WScript.StdIn.ReadAll();
      }
      Process(input)
   } else {
      // работать построчно
      while (!WScript.StdIn.AtEndOfStream) {
         input = WScript.StdIn.ReadLine();
         Process(input)
      }
   }
   input = null;

} catch(e) {
   WSH.Popup(e.description,0,&#039;Ошибка выполнения&#039;,16+0);
}


function Process(){
   if (isRepl) {
      // заменять найденное
      WScript.StdOut.Write( input.replace(reg, toRepl) + ((!isBlk) ? &#039;\n&#039; : &#039;&#039;) );
   } else {
      // вывести только найденное
      if ( sr = input.match(reg) ) {
         if (isGlob){
            // If the global flag is set, elements 0 - n contain all matches that occurred. (MS Help)
            // Выводим весь список совпавших подстрок
            for(var i=0; i&lt;sr.length; i++) {
               WScript.StdOut.WriteLine(sr[i]);
            }
         } else {
            // If the global flag (g) is not set, Element zero of the array contains the entire match,
            // while elements 1 – n contain any submatches that have occurred within the match. (MS Help)
            // Выводим первую попавшуюся подстроку
            WScript.StdOut.WriteLine(sr[0]);
         }
      }
   }
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[delpher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=6992</uri>
			</author>
			<updated>2007-11-19T04:43:55Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=6110#p6110</id>
		</entry>
</feed>
