Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Регулярные выражения в JavaScript

18K
17 марта 2011 года
s2dent
13 / / 01.09.2006
Доброго дня. Возникла проблема над которой бьюсь не один день, как в регулярных выражениях на JavaScript использовать мультистроковый режим? Т.е.:
 
Код:
var my_string= "str1 текст 1 текст 2 str2";
var new_string = my_string.match(/str1(.*)str1/));

в new_string[1] получаем "текст 1 текст 2", а вот, если:
 
Код:
var my_string= "str1 текст 1
текст 2 str2";
var new_string = my_string.match(/str1(.*)str1/));

new_string = NULL :( Пробовал с модификатором "m" - тоже самое :confused:
В общем мне нужно на выходе получить текст:
"текст 1
текст 2"
244
17 марта 2011 года
UAS
2.0K / / 19.07.2006
Модификатор s
18K
17 марта 2011 года
s2dent
13 / / 01.09.2006
В таком случае ошибка в скрипте: "Ошибка: invalid regular expression flag s"
369
17 марта 2011 года
Kesano
451 / / 09.10.2007
А вы собственно объект RegExp создаете?
И где паттерн?...
И вообще, у вас код - бред сивой кобылы...
Во-первых, Javascript, насколько я знаю, не позволяет использовать многострочный код при задаче значений типа
[HTML]var my_string= "str1 текст 1
текст 2 str2";[/HTML]
Можно только
var my_string= "str1 текст 1 \r\n текст 2 str2";
Или
var my_string= "str1 текст 1 "+
+"текст 2 str2";

Во-вторых, у вас криво задано регулярное выражение.
В-третьих, var new_string = my_string.match(/str1(.*)str1/)); - лично у меня здесь не сошлось количество открытых\закрытых скобок...

Вы вообще пробовали гуглить? "Регулярные выражения Javascript" - этого запроса достаточно, первую страницу ссылок прочитать, изучить и потом писать сюда, если непонятно.
18K
17 марта 2011 года
s2dent
13 / / 01.09.2006
Цитата: Kesano
А вы собственно объект RegExp создаете?
И где паттерн?...
И вообще, у вас код - бред сивой кобылы...
Во-первых, Javascript, насколько я знаю, не позволяет использовать многострочный код при задаче значений типа
[HTML]var my_string= "str1 текст 1
текст 2 str2";[/HTML]
Можно только
var my_string= "str1 текст 1 \r\n текст 2 str2";
Или
var my_string= "str1 текст 1 "+
+"текст 2 str2";

Во-вторых, у вас криво задано регулярное выражение.
В-третьих, var new_string = my_string.match(/str1(.*)str1/)); - лично у меня здесь не сошлось количество открытых\закрытых скобок...

Вы вообще пробовали гуглить? "Регулярные выражения Javascript" - этого запроса достаточно, первую страницу ссылок прочитать, изучить и потом писать сюда, если непонятно.



Во-первых: текст грабится с другого html и символы новой строки там есть (текст дал для примера).
Во-вторых, лично Вам нужно понимать, что написано от руки и опечатка вполне возможна, я же не листинг с миллионом строк преподал для разбора.
В-третьих: наверное, если гугл помог, я бы сюда не писал.
В-четвёртых, лично для Вас, если видите оплошность, напишите верный вариант, если не знаете, не нужно флудить (это Вы, я вижу, умеете).

369
17 марта 2011 года
Kesano
451 / / 09.10.2007
Студент, не обижайся, но верный вариант я тебе уже подсказал - Гугл. Просто потому что там есть море русскоязычных мануалов в JS...

Да, наверное я был слишком категоричен и резок с тобой.
Начнем сначала:
1. Скажи, ты пробовал найти правильный пример регулярного выражения на JS и разобраться с многострочностью?... Т.е. не бери HTML с другого сайта, а попытайся самостоятельно реализовать элементарную регулярку.
Ты делал это? Всё получалось?
274
17 марта 2011 года
Lone Wolf
1.3K / / 26.11.2006
не умничайте пожалуйста здесь. Телепатов тут нет, чтобы знать ваш уровень владения темой. и догадываться где вы опечатались постя на форум, а где реальная ошибка, как-то не охота.

Теперь по теме. Если убрать опечтаку со скобкой, то код работает абсолютно правильно. ваша строка не соответсвует регулярке.
var new_string = my_string.match(/str1(.*)str1/)

А многострочность - модификатор m
18K
17 марта 2011 года
s2dent
13 / / 01.09.2006
Цитата: Kesano
Студент, не обижайся, но верный вариант я тебе уже подсказал - Гугл. Просто потому что там есть море русскоязычных мануалов в JS...

Да, наверное я был слишком категоричен и резок с тобой.
Начнем сначала:
1. Скажи, ты пробовал найти правильный пример регулярного выражения на JS и разобраться с многострочностью?... Т.е. не бери HTML с другого сайта, а попытайся самостоятельно реализовать элементарную регулярку.
Ты делал это? Всё получалось?


В том-то и дело, что весь гугл (и не только) облазил, но нормального примера с многострочным разбором не нашел, и просто разбирать текст с символами абзацев и конца строки пробовал... :(
Можно сделать так:

Код:
function getParsing(str)
{
  var reg_str = new RegExp(/ключ1([^]*)ключ2/g);
  var match;
  var arr = new Array();
  while (match = reg_str.exec(str))
 {
  arr.push(match[0]);
 }
  return arr;
}

Но хотелось бы услышать, может есть более простые варианты...
244
17 марта 2011 года
UAS
2.0K / / 19.07.2006
Цитата:
Во-первых, Javascript, насколько я знаю, не позволяет использовать многострочный код при задаче значений типа


Позволяет. Надо в конце строки ставить \
И вообще - много что-то исполняете тут на публику, можно и вежливей. Задача, между прочим, не тривиальная - я сам решения сразу не нашёл.

Модификатор s JavaScript почему-то не поддерживает, подерживает только g,i,m ни один из которых толком ничего не даёт. Решение - замена \r\n на [\s\S]
Т.е. регулярка будет: /str1(.*?)[\s\S]*?str2/

Автору - код надо писать сразу без ошибок. То, что это "опечатка" рукописная - кто знает. Есть просто опечатки мелкие, но общий смысл понятен. А когда приводят мелкий код и лепят в нем столько очевидных ошибок - это уж не совсем хорошо.

369
18 марта 2011 года
Kesano
451 / / 09.10.2007
Цитата: UAS
Позволяет. Надо в конце строки ставить \
И вообще - много что-то исполняете тут на публику, можно и вежливей. Задача, между прочим, не тривиальная - я сам решения сразу не нашёл.


За бэкслэш - спс.
По поводу "Исполнения на публику" - пока котёнка носом в его же дерьмо не ткешь - не дойдет.
По поводу решения - нашел быстро...
Копируйте код, проверяйте...
[HTML]<html>
<head> <title></title>
</head>

<body>
<script type="text/javascript">
function reg() {
document.getElementById("pole").innerHTML="";
var str=document.getElementById("text").value;
var look=document.getElementById("look").value;
var pattern = new RegExp(look,"igm");
res = str.match(pattern, str);

if(res) {
for(i=0; i<res.length; i++) {
document.getElementById("pole").innerHTML+=res+"<br/>";
}
alert(res.length);
}

}

</script>
Что ищем?<br/>
<textarea id="look">p1 ([\s\S]*) p2</textarea><br/>
Где ищем?<br/>
<textarea id="text">Ненада нИнада
p1 Текст тест ламер
ПроГрАмМер Тест нафиг ЛамЕр p2 Программер</textarea><br/>
<a href="java script:reg();">Искать</a>
<div id="pole"></div>

</body>
</html>[/HTML]

Где p1, p2 - маркеры, между которыми находится искомый текст...
В Текстареа содержимое, как я вижу, мультистрочное. p1(.8)p2 и p1([\s\S]*)p2 дают разные результаты...
Если * получается слишком жадной, можно заменить на ? и получим p1 ([\s\S]+?) p2
Протестил - отлично работает.
З.Ы. UAS, ты меня в своё время грамотно просвятил по регуляркам...

18K
18 марта 2011 года
s2dent
13 / / 01.09.2006
Цитата: UAS
Позволяет. Надо в конце строки ставить \
И вообще - много что-то исполняете тут на публику, можно и вежливей. Задача, между прочим, не тривиальная - я сам решения сразу не нашёл.

Модификатор s JavaScript почему-то не поддерживает, подерживает только g,i,m ни один из которых толком ничего не даёт. Решение - замена \r\n на [\s\S]
Т.е. регулярка будет: /str1(.*?)[\s\S]*?str2/

Автору - код надо писать сразу без ошибок. То, что это "опечатка" рукописная - кто знает. Есть просто опечатки мелкие, но общий смысл понятен. А когда приводят мелкий код и лепят в нем столько очевидных ошибок - это уж не совсем хорошо.


Огромное спасибо, именно то, что нужно!!!

244
18 марта 2011 года
UAS
2.0K / / 19.07.2006
Вместо спасибо - под ником на 6-конечную звезду жмите и там плюсики)
На будущее - используйте RegexCoach - для проверки регулярок пока что ничего лучше не встречал.
18K
18 марта 2011 года
s2dent
13 / / 01.09.2006
Про звезду помню )))
369
18 марта 2011 года
Kesano
451 / / 09.10.2007
Цитата: UAS

На будущее - используйте RegexCoach - для проверки регулярок пока что ничего лучше не встречал.


Кстати, http://www.pcre.ru/eval/ удобнее + онлайн + не нужно ничего ставить.
Качал я этот RegexCoach - нифига в нем не понял...
З.Ы. ответ+код на пред. странице.

18K
18 марта 2011 года
s2dent
13 / / 01.09.2006
Спасибо, изучим.
18K
18 марта 2011 года
s2dent
13 / / 01.09.2006
Цитата: UAS

На будущее - используйте RegexCoach - для проверки регулярок пока что ничего лучше не встречал.


Да, действительно, полезное и главное простое в понимании приложение, в самый раз для помощи в изучении регулярок.

244
18 марта 2011 года
UAS
2.0K / / 19.07.2006
Цитата:
Качал я этот RegexCoach - нифига в нем не понял...


Ну, чья ж это проблема, что в таком замечательном приложении не смогли разобраться?)) Тем более RegexCoach помощнее будет значительно. Тем более регулярки я использую, обычно, как минимум, в 4 разных языках, так что вариант для "только для JS" меня однозначно не устраивает

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог