Просмотр полной версии : поиск необязательного значения с помощью рег выражения
Добрый день
Помогите с рег выражением
есть элементы в тексте которые есть всегда (text1 и text3), а часть может присутствовать или нет (text2)
упростил выражение, для публикации тут:
/(text1).*?(text2)?.*?(text3)/
где 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>
Если по условию text2 может и быть, и отсутствовать, то проверять его наличие нет смысла, проверяйте только наличие text1 и text3.
данное регулярное выражение - не проверяет наличие или отсутствие текста, оно выдирает (парсит) из текста искомые данные
З.Ы. проверять оно конечно проверяет, на соответствие основным элементам, но выдернуть нужно все, в том числе и те данные, которых может и не быть, при их наличии
Cache,
<script>
var str='text1 aaaaa aa aaa aaaa aaa aaa a text2 aaaa aaaa aaaa aaa aaa text3',
rx=/(text1|text2|text3)/g;
document.write(str.match(rx).join('<br>'));
</script>
рони,
это не совсем то, я не просто так упомянул, что рег. выражение сильно упрощено
как я понимаю, иных вариантов нет? либо выдергивать кусок текста между text1 и text3, и уже его обрабатывать отдельным рег выражением?
рони,
потому что парсится код таблицы и text1 и text3 находятся в одной строке (если вообще есть)
если делать через или получу кашу из значений
Cache,
match == null ничего не найдено
match.length == 2 text2 нет
match.length == 3 text2 = match[1]
Cache,
<script>
var str='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.length ===3 && match[1]);
</script>
рони,
<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>
а должно было быть так:
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',
rx=/(text1|text2|text3)/g,
match = str.match(rx)||[];
document.write(match);
</script>
вот так, да все верно
Спасибо
Alexandroppolus
07.10.2019, 13:39
/(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');
Alexandroppolus,
спасибо, возьму на вооружение
Alexandroppolus
07.10.2019, 15:55
Cache,
вообще говоря, моя регулярка может облажаться, если в строке несколько совпадений:
'text1 a text3 aaaa text1 a text2 a text3'
здесь (?:.*?(text2)) жадничает в попытке найти text2, и проскакивает text3.
Поправка:
/(text1)(?:(?:(?!text3).)*?(text2))?.*?(text3)/ - теперь мы проверяем точки, чтобы не проскочить.
Если по условию text2 может и быть, и отсутствовать, то проверять его наличие нет смысла, проверяйте только наличие text1 и text3. Как такое может быть? Рассмотрим, например, разбор числа в JavaScript. Например, 15 и 1e+5, по вашему утверждению получается, что, поскольку подстрока e+ может и быть, а может и отсутствовать, следовательно проверять её наличие нет смысла, то получается, что это одинаковые числа!
laimas иногда провозглашает удивительнейшие вещи! Диковинка!
он присутствует, выражение его не сохраняет в найденных
что делаю не так? У вас 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>
а должно было быть так:
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>
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot