Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 06.10.2019, 18:32
Кандидат Javascript-наук
Отправить личное сообщение для Cache Посмотреть профиль Найти все сообщения от Cache
 
Регистрация: 02.05.2013
Сообщений: 111

рони,
не заметил что вы поставили ограничители начала и конца строк
рони,
<script>
var str='text1 aaaaa aa aaa aaaa aaa aaa a text2 aaaa aaaa aaaa aaa aaa text3 text1 aaaaa aa aaa aaaa aaa aaa a aaaa aaaa aaaa aaa aaa text3 text1 aaaaa aa aaa aaaa aaa aaa a text2 aaaa aaaa aaaa aaa aaa text3',
    rx=/(text1|text2|text3)/g,
    match = str.match(rx)||[];
document.write(match);
</script>

вот так, да все верно

Спасибо
Ответить с цитированием
  #12 (permalink)  
Старый 07.10.2019, 13:39
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,007

/(text1|text2|text3)/g - совсем не то же самое, что регулярка в стартовом посте. Здесь куски находятся по отдельности, а там - именно как составная конструкция.

в стартовом посте text2 не вылавливается из-за нежадности. Первая .*? забирает пустую подстроку, потом не находится text2, далее .*? растягивается до text3, и всё. Регулярка не замотивирована найти text2 в середине.

самый простой (но не факт, что универсальный) способ допилки стартового регекса:
var rx = /(text1)(?:.*?(text2))?.*?(text3)/;

function exec(str) {
    var m = rx.exec(str);
    if (!m) { return alert([str, '', 'not matched'].join('\n')); }
    alert([str, '', m[1], m[2], m[3]].join('\n'));
}

exec('aaaa text1 aaaaa text2 aaaa  text3 aaaa');
exec('aaaa text1 aaaaa aaaa  text3 aaaa');
exec('aaaa text1 aaaaa text2 aaaa  aaaa');
Ответить с цитированием
  #13 (permalink)  
Старый 07.10.2019, 14:05
Кандидат Javascript-наук
Отправить личное сообщение для Cache Посмотреть профиль Найти все сообщения от Cache
 
Регистрация: 02.05.2013
Сообщений: 111

Alexandroppolus,
спасибо, возьму на вооружение
Ответить с цитированием
  #14 (permalink)  
Старый 07.10.2019, 15:55
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,007

Cache,

вообще говоря, моя регулярка может облажаться, если в строке несколько совпадений:
'text1 a text3 aaaa text1 a text2 a text3'
здесь (?:.*?(text2)) жадничает в попытке найти text2, и проскакивает text3.

Поправка:
/(text1)(?:(?:(?!text3).)*?(text2))?.*?(text3)/
- теперь мы проверяем точки, чтобы не проскочить.

Последний раз редактировалось Alexandroppolus, 07.10.2019 в 18:51.
Ответить с цитированием
  #15 (permalink)  
Старый 07.10.2019, 16:24
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от laimas
Если по условию text2 может и быть, и отсутствовать, то проверять его наличие нет смысла, проверяйте только наличие text1 и text3.
Как такое может быть? Рассмотрим, например, разбор числа в JavaScript. Например, 15 и 1e+5, по вашему утверждению получается, что, поскольку подстрока e+ может и быть, а может и отсутствовать, следовательно проверять её наличие нет смысла, то получается, что это одинаковые числа!

laimas иногда провозглашает удивительнейшие вещи! Диковинка!

Сообщение от Cache
он присутствует, выражение его не сохраняет в найденных
что делаю не так?
У вас text2 необязателен, да ещё находится в окружении .*, что позволяет никогда его не находить. Я думаю, что можно рассмотреть оба варианта: наличие text2 .*(text2).* и его отсутствие .*.
<script>
var 
   str='text1 aaaaa aa aaa aaaa aaa aaa a text2 aaaa aaaa aaaa aaa aaa text3', 
   rx=/(text1)(?:.*(text2).*|.*)(text3)/;
document.write(rx.exec(str).join('<br>'));
</script>

Последний раз редактировалось Malleys, 07.10.2019 в 16:47.
Ответить с цитированием
  #16 (permalink)  
Старый 07.10.2019, 16:46
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от Cache
а должно было быть так:
text1,text2,text3,text1,text3,text1,text2,text3
<script>
var str = "text1 aaaaa aa aaa aaaa aaa aaa a text2 aaaa aaaa aaaa aaa aaa text3 text1 aaaaa aa aaa aaaa aaa aaa a aaaa aaaa aaaa aaa aaa text3 text1 aaaaa aa aaa aaaa aaa aaa a text2 aaaa aaaa aaaa aaa aaa text3";
var result = str.split(/(text1|text2|text3)/).filter(function(v, i) { return i % 2 === 1 });
document.write(result);
</script>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу для вычисления значения выражения: vanya_xa Общие вопросы Javascript 1 17.02.2018 20:46
Вывод значения из JSON с помощью JS Win_D Общие вопросы Javascript 9 15.09.2016 10:15
Помогите с кодом. Поиск и вывод нужного значения Sav2907 Элементы интерфейса 30 17.09.2015 16:54
Вычисление значения выражения без eval Matre Общие вопросы Javascript 6 19.11.2011 12:04
поиск значения среди опр. тега cristaloleg Элементы интерфейса 2 26.04.2010 17:50