<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBScript: работа с "обрамляющими" конструкциями в рег. выражениях]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=616&amp;type=atom" />
	<updated>2007-08-21T14:07:21Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=616</id>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: работа с "обрамляющими" конструкциями в рег. выражениях]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=4152#p4152" />
			<content type="html"><![CDATA[<p>Теперь задача, похожая на предыдущую, но &quot;наоборот&quot;: необходимо извлечь все фрагменты, начинающиеся на &quot;a&quot; и заканчивающиеся на &quot;b&quot;, и находящиеся только <strong>вне</strong> угловых скобок. Решение:<br /></p><div class="codebox"><pre><code>Set objRegExp = CreateObject(&quot;VBScript.RegExp&quot;)
objRegExp.Global = True
Str = &quot;&lt;123a1b123&gt;a2b&lt;a11b&gt;a22b&lt;a111b&gt;&quot;
objRegExp.Pattern = &quot;(^|&gt;)[^&lt;]*?(a[^&lt;&gt;]*?b)[^&gt;]*?(&lt;|$)&quot;
Set objMatches = objRegExp.Execute(Str)
For Each objMatch In objMatches
    WScript.Echo objMatch.SubMatches(1)
Next</code></pre></div><p>&quot;Вне конструкции&quot; - это значит, что непосредственно слева - либо ничего, либо только закрывающая угловая скобка, а справа - либо ничего, либо только открывающая угловая скобка, т.е. шаблон такой: &quot;начало строки ИЛИ закрывающая - любые символы кроме открывающей - наш шаблон - любые символы кроме закрывающей - открывающая ИЛИ конец строки&quot;.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2007-08-21T14:07:21Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=4152#p4152</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: работа с "обрамляющими" конструкциями в рег. выражениях]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=4151#p4151" />
			<content type="html"><![CDATA[<p>Иногда требуется извлечь из текста все вхождения, удовлетворяющие определённому шаблону, со следующим условием: такие вхождения должны находиться внутри определённой обрамляющей конструкции. При этом внутри этой же обрамляющей конструкции может находиться и другой текст, который нам не нужен.</p><p>Например: необходимо извлечь все фрагменты, начинающиеся на &quot;a&quot; и заканчивающиеся на &quot;b&quot;, и находящиеся только внутри угловых скобок. Скажем, из строки:<br /></p><div class="quotebox"><blockquote><p>&lt;123a1b123&gt;a2b&lt;a11b&gt;a22b&lt;a111b&gt;</p></blockquote></div><p>Нужно извлечь <strong>a1b</strong>, <strong>a11b</strong>, <strong>a111b</strong>, которые находятся внутри угловых скобок, но никак не <strong>a2b</strong> и <strong>a22b</strong>, которые находятся вне угловых скобок. Проблема решается следующим образом:<br /></p><div class="codebox"><pre><code>Set objRegExp = CreateObject(&quot;VBScript.RegExp&quot;)
objRegExp.Global = True
Str = &quot;&lt;123a1b123&gt;a2b&lt;a11b&gt;a22b&lt;a111b&gt;&quot;
objRegExp.Pattern = &quot;(&lt;[\s\S]*?)(a[\s\S]*?b)([\s\S]*?&gt;)&quot;
Set objMatches = objRegExp.Execute(Str)
For Each objMatch In objMatches
    WScript.Echo objMatch.SubMatches(1)
Next</code></pre></div><p>В данном случае шаблон <strong>(&lt;[\s\S]*?)(a[\s\S]*?b)([\s\S]*?&gt;)</strong> состоит из трёх частей, ограниченных скобками, которые будут возвращены в коллекции SubMatches каждого найденного совпадения (соответственно, с индексами 0, 1 и 2). Первая часть означает &quot;открывающая угловая скобка, затем любое количество любых символов&quot;. Вторая часть означает &quot;буква а, затем любое количество любых символов, затем буква b&quot;. Третья часть означает &quot;любое количество любых символов, затем закрывающая угловая скобка&quot;. При получении нам нужна только вторая часть (с индексом 1), и именно её мы и получаем.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2007-08-21T13:29:25Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=4151#p4151</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBScript: работа с "обрамляющими" конструкциями в рег. выражениях]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=4148#p4148" />
			<content type="html"><![CDATA[<p>Часто требуется извлечь из текста все вхождения, удовлетворяющие определённому шаблону. Например, извлечь все фрагменты, заключённые в угловые скобки:<br /></p><div class="codebox"><pre><code>Set objRegExp = CreateObject(&quot;VBScript.RegExp&quot;)
objRegExp.Global = True
Str = &quot;&lt;t1&gt;a&lt;t2&gt;b&lt;t3&gt;&quot;
objRegExp.Pattern = &quot;&lt;[\s\S]*&gt;&quot;
Set objMatches = objRegExp.Execute(Str)
For Each objMatch In objMatches
    WScript.Echo objMatch.Value
Next</code></pre></div><p>В данном примере конструкция <strong>[\s\S]*</strong> означает &quot;любое количество любых символов&quot;.<br />Однако, результат может показаться немного неожиданным: возвращены будут вовсе не три фрагмента <strong>&lt;t1&gt;</strong>, <strong>&lt;t2&gt;</strong> и <strong>&lt;t3&gt;</strong> по отдельности, вся строка целиком как один фрагмент. Происходит это потому, что вся строка целиком, как ни странно, вполне удовлетворяет шаблону <strong>&lt;[\s\S]*&gt;</strong>. Такое поведение регулярных выражений называется &quot;жадным&quot;, когда подходящим считается наиболее длинный фрагмент, удовлетворяющий шаблону. Чтобы сделать регулярное выражение &quot;нежадным&quot;, в нашем шаблоне следует использовать знак вопроса после звёздочки:<br /></p><div class="quotebox"><blockquote><p>&lt;[\s\S]*?&gt;</p></blockquote></div><p>В этом случае три фрагмента <strong>&lt;t1&gt;</strong>, <strong>&lt;t2&gt;</strong> и <strong>&lt;t3&gt;</strong> будут возвращены по отдельности.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2007-08-21T12:53:37Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=4148#p4148</id>
		</entry>
</feed>
