renovations

This commit is contained in:
Ilya Kantor 2015-04-06 09:20:38 +03:00
parent 36b0b5b7d7
commit 0d6ca23fb7
8 changed files with 112 additions and 6 deletions

View file

@ -0,0 +1,36 @@
Сначала неправильный способ.
Если перечислить языки один за другим через `|`, то получится совсем не то:
```js
//+ run
var reg = /Java|JavaScript|PHP|C|C\+\+/g;
var str = "Java, JavaScript, PHP, C, C++";
alert( str.match(reg) ); // Java,Java,PHP,C,C
```
Как видно, движок регулярных выражений ищет альтернации в порядке их перечисления. То есть, он сначала смотрит, есть ли <code class="match">Java</code>, а если нет -- ищет <code class="match">JavaScript</code>.
Естественно, при этом <code class="match">JavaScript</code> не будет найдено никогда.
То же самое -- с <code class="match">C</code> и <code class="match">C++</code>.
Есть два решения проблемы:
<ol>
<li>Поменять порядок, чтобы более длинное совпадение проверялось первым: <code class="pattern">JavaScript|Java|C\+\+|C|PHP</code>.</li>
<li>Соединить длинный вариант с коротким: <code class="pattern">Java(Script)?|C(\+\+)?|PHP</code>.</li>
</ol>
В действии:
```js
//+ run
var reg = /Java(Script)?|C(\+\+)?|PHP/g;
var str = "Java, JavaScript, PHP, C, C++";
alert( str.match(reg) ); // Java,JavaScript,PHP,C,C++
```

View file

@ -0,0 +1,6 @@
# Найдите языки программирования
Существует много языков программирования, например Java, JavaScript, PHP, C, C++.
Напишите регулярное выражение, которое найдёт их все в строке "Java JavaScript PHP C++ C"

View file

@ -0,0 +1,19 @@
Решение задачи: <code class="pattern">/"(\\.|[^"\\])*"/g</code>.
То есть:
<ul>
<li>Сначала ищем кавычку <code class="pattern">"</code></li>
<li>Затем, если далее слэш <code class="pattern">\\</code> (удвоение слэша -- техническое, для вставки в регэксп, на самом деле там один слэш), то после него также подойдёт любой символ (точка).</li>
<li>Если не слэш, то берём любой символ, кроме кавычек (которые будут означать конец строки) и слэша (чтобы предотвратить одинокие слэши, сам по себе единственный слэш не нужен, он должен экранировать какой-то символ) <code class="pattern">[^"\\]</code></li>
<li>...И так жадно, до закрывающей кавычки.</li>
</ul>
В действии:
```js
//+ run
var re = /"(\\.|[^"\\])*"/g;
var str = '.. "test me" .. "Скажи \\"Привет\\"!" .. "\\r\\n" ..';
alert( str.match(re) ); // "test me","Скажи \"Привет\"!","\r\n"
```

View file

@ -0,0 +1,27 @@
# Найдите строки в кавычках
Найдите при помощи регэкспа строки в двойных кавычках <code class="subject">"..."</code>.
В строке *могут* быть любые символы, включая вложенные кавычки, заэкранированные слэшем, то есть: <code class="subject">\"</code>, <code class="subject">\n</code>. Слэш удваивается, чтобы вставить его как символ: <code class="subject">\\</code>.
Иначе говоря, синтаксис строки -- примерно соответствует используемому в JavaScript. Нужно такие строки найти.
Пример совпадающих строк:
```js
var str = ' .. *!*"test me"*/!* .. ';
var str = ' .. *!*"Скажи \\"Привет\\"!"*/!* ... ';
var str = ' .. *!*"\\r\\n"*/!* .. ';
```
Слэши в этих строках удвоены по технической причине -- в JavaScript кавычки `'...'` считают слэш специальным символом и требуют его экранировать.
Так что на самом деле, к примеру, в такой строке одинарные слэши:
```js
//+ run
var str = ' .. *!*"Скажи \\"Привет\\"!"*/!* ... ';
alert(str); // .. "Скажи \"Привет\" ...
```

View file

@ -41,9 +41,9 @@ alert( str.match(reg) ); // массив всех совпадений: 7,9,0,3,
Наиболее часто используются: Наиболее часто используются:
<dl> <dl>
<dt>`\d` (от английского "digit" - "цифра")</dt> <dt>`\d` (от английского "digit" -- "цифра")</dt>
<dd>Цифра, символ от `0` до `9`.</dd> <dd>Цифра, символ от `0` до `9`.</dd>
<dt>`\s` (от английского "space" - "пробел")</dt> <dt>`\s` (от английского "space" -- "пробел")</dt>
<dd>Пробельный символ, включая табы, переводы строки и т.п.</dd> <dd>Пробельный символ, включая табы, переводы строки и т.п.</dd>
<dt>`\w` (от английского "word" -- "слово") </dt> <dt>`\w` (от английского "word" -- "слово") </dt>
<dd>Символ "слова", а точнее -- буква латинского алфавита или цифра или подчёркивание `'_'`. Не-английские буквы не являются `\w`, то есть русская буква не подходит.</dd> <dd>Символ "слова", а точнее -- буква латинского алфавита или цифра или подчёркивание `'_'`. Не-английские буквы не являются `\w`, то есть русская буква не подходит.</dd>
@ -142,7 +142,7 @@ alert( str.replace(/\D/g, "") ); // 79031234567
## Пробелы -- обычные символы ## Пробелы -- обычные символы
Заметим, что в регулярных выражениях пробел - такой же символ, как и другие. Заметим, что в регулярных выражениях пробел -- такой же символ, как и другие.
Обычно мы не обращаем внимание на пробелы. Для нашего взгляда строки <code class="subject">1-5</code> и <code class="subject">1 - 5</code> почти идентичны. Обычно мы не обращаем внимание на пробелы. Для нашего взгляда строки <code class="subject">1-5</code> и <code class="subject">1 - 5</code> почти идентичны.

View file

@ -22,4 +22,13 @@ alert( str.match(re) ); // #121212,#AA00ef
alert( "#12345678".match( /#[a-f0-9]{6}/gi ) ) // #12345678 alert( "#12345678".match( /#[a-f0-9]{6}/gi ) ) // #12345678
``` ```
Если это является проблемой, то ее можно решить чуть более сложным выражением. Чтобы такого не было, можно добавить в конец `\b`:
```js
//+ run
// цвет
alert( "#123456".match( /#[a-f0-9]{6}\b/gi ) ); // #123456
// не цвет
alert( "#12345678".match( /#[a-f0-9]{6}\b/gi ) ); // null
```

View file

@ -1,4 +1,4 @@
Регулярное выражение для поиска 3-значного цвета: <code class="pattern">/#[a-f0-9]{3}/i</code>. Регулярное выражение для поиска 3-значного цвета вида `#abc`: <code class="pattern">/#[a-f0-9]{3}/i</code>.
Нужно добавить ещё три символа, причём нужны именно три, четыре или семь символов не нужны. Эти три символа либо есть, либо нет. Нужно добавить ещё три символа, причём нужны именно три, четыре или семь символов не нужны. Эти три символа либо есть, либо нет.
@ -18,4 +18,13 @@ var str = "color: #3f3; background-color: #AA00ef; and: #abcd";
alert( str.match(re) ); // #3f3 #AA0ef #abc alert( str.match(re) ); // #3f3 #AA0ef #abc
``` ```
В последнем выражении <code class="subject">#abcd</code> было найдено совпадение <code class="match">#abc</code>. Чтобы этого не происходило, добавим в конец <code class="pattern">\b</code>:
```js
//+ run
var re = /#([a-f0-9]{3}){1,2}\b/gi;
var str = "color: #3f3; background-color: #AA00ef; and: #abcd";
alert( str.match(re) ); // #3f3 #AA0ef
```

View file

@ -11,4 +11,4 @@ var str = "color: #3f3; background-color: #AA00ef; and: #abcd";
alert( str.match(re) ); // #3f3 #AA0ef alert( str.match(re) ); // #3f3 #AA0ef
``` ```
P.S. Значения из четырёх и более букв, такие как `#abcd` мы в этой задаче также учитываем, но берём из них только необходимые для совпадения символы, то есть `#abc`. P.S. Значения из любого другого количества букв, кроме 3 и 6, такие как `#abcd`, не должны подходить под регэксп.