Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Аналог && в регулярных выражениях (https://javascript.ru/forum/misc/39699-analog-v-regulyarnykh-vyrazheniyakh.html)

lancer 08.07.2013 17:25

Аналог && в регулярных выражениях
 
Внимательно прочел здесь статью регулярные выражения, нашел там, что "|" это "или", но не нашел ничего про "и".

Ищу обязательное присутствие B и A.
Попробывал & по аналогии и && на всякий, но не работает никак.

a = "qwertyqwerBtyA";
b_reg = /B&A/g;
		
$("#draggable").click(function(){
	if(b_reg.test(a))
		alert("Есть");	
});

skrudjmakdak 08.07.2013 17:29

b_reg = /[BA]/g;

Deff 08.07.2013 17:35

a = "qwertyqwerBtyA";
b_reg = /B.*A|A.*В/g;
		
$("#draggable").click(function(){
	if(b_reg.test(a))
		alert("Есть");	
});

рони 08.07.2013 18:11

Deff,
на всякий случай
var a = "qwertyqwerBtyA",
 b = "qwertyqwerBt\nyA",
 b_reg = /B.*A|A.*В/gim,
 a_reg = /B[\S\s]*A|A[\S\s]*В/gim;
 alert([b_reg.test(a),b_reg.test(b),a_reg.test(b)]);

Deff 08.07.2013 18:58

alert(/B[^A]*A|A[^B]*В/gim.test("qwertyqwerBt\nyA"))

devote 08.07.2013 19:00

Deff,
меняю местами буквы
alert(/B[^A]*A|A[^B]*В/gim.test("qwertyqwerAt\nyB"))

devote 08.07.2013 19:04

alert(/B[\s\S]*A|A[\s\S]*B/gim.test("qwertyqwerBt\nyA"))
alert(/B[\s\S]*A|A[\s\S]*B/gim.test("qwertyqwerAt\nyB"))

Deff 08.07.2013 20:06

:D
alert(/A/gim.test("qwertyqwerBt\nyA")&&/B/gim.test("qwertyqwerBt\nyA"))
alert(/A/gim.test("qwertyqwerBt\nyA")&&/B/gim.test("qwertyqwerAt\nyB"))

lancer 09.07.2013 15:53

Цитата:

Сообщение от skrudjmakdak (Сообщение 261062)
b_reg = /[BA]/g;

Ваш пример не работает - срабатывает когда есть одна из букв, а я спрашивал когда присутствуют обе.

lancer 09.07.2013 17:22

Пример Deff'a.

Цитата:

Сообщение от Deff (Сообщение 261068)
a = "qwertyqwerBtyA";
b_reg = /B.*?A|A.*?В/g;
		
$("#draggable").click(function(){
	if(b_reg.test(a))
		alert("Есть");	
});

В чем смысл "?", если возможность отсутствия элемента уже описана звездочкой.

Цитата:

* - Обозначает повторение 0 или более раз.
0 и есть отсутствие.

Еще вопрос, можно объяснить жадность/нежадность «на пальцах»? Везде об этом пишут, но почему-то в двух-трех абзацах, из которых как ни крути ничего не ясно.

Deff 09.07.2013 17:47

Цитата:

Сообщение от lancer
В чем смысл "?", если возможность отсутствия элемента уже описана звездочкой.

Есть такое свойство, как жадность.. http://javascript.ru/tutorial/regexp-specials
т.есть жадность в /B.*A/ , может с размаху захватить первые A
хотя в данном паттерне "?" - не нужна, /посколь достаточно захватить любое из А

рони 09.07.2013 22:21

Цитата:

Сообщение от Deff
т.есть жадность в /B.*A/ , может с размаху захватить первые A
хотя в данном паттерне "?" - не нужна, /посколь достаточно захватить любое из А

сомнительная экономия но при ? быстрее найдёт.

lancer 10.07.2013 13:10

Пример замены открывающего тега.

text = '1 <A href="#">...</A> 2'
text = text.replace(/<A([^>]*)>/, 'TEST')
alert(text)


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

рони 10.07.2013 13:12

Цитата:

Сообщение от lancer
^>

это не один символ -- это всё кроме >

lancer 10.07.2013 13:14

Цитата:

Сообщение от рони (Сообщение 261545)
это не один символ -- это всё кроме >

Знаю, но не суть, я имел ввиду на A она никак действовать не может, только на один символ или выражение в кдвадратных скобках слева от себя. На один символ/одно выражение в скобках, A под эту звездочку никак не попадает.

Поэтому вопрос про круглые скобки остается(он через один ответ выше).


Еще вопрос про то как жадность проявляется.

text = '1 <A href="#">...</A> 2'
text = text.replace(/<A([^>]*)>/, 'TEST')
alert(text)

Цитата:

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

Это происходит из-за того, что точка-звездочка в "жадном" режиме пытается захватить как можно больше, в нашем случае - это как раз до последнего >.
Следуя какой-такой логике она пытается захватить как можно больше >, если выражение [^>], к которому она относится, не ищет >? Но получается в тоже время содержание > в этом выражении и есть причина жадности на символы >?

lancer 10.07.2013 17:23

Up

bes 10.07.2013 21:33

Цитата:

Сообщение от lancer
Внимательно прочел здесь статью регулярные выражения, нашел там, что "|" это "или", но не нашел ничего про "и".

это как, на одном месте одновременно и одно и другое что ли
в том и смысл, что на одном месте либо одно, либо другое

задачу опиши точнее

MiksIr 10.07.2013 22:32

Цитата:

Сообщение от lancer
Следуя какой-такой логике она пытается захватить как можно больше >, если выражение [^>], к которому она относится, не ищет >? Но получается в тоже время содержание > в этом выражении и есть причина жадности на символы >?

<[^>]*> аналогично <.*?> (ну с учетом особенностей точки)
Запись <[^>]*?> смысла не имеет.

Цитата:

Сообщение от lancer
Зачем здесь применяется группировка при помощи круглых скобок, ведь звездочка действует только на один символ, который располагается перед ней, в данном случае на фигурные скобки.

Скобки - это еще и выделение под-совпадений, которые вы можете использовать дальше в коде, или использовать в замене. Например, text.replace(/<A([^>]*)>/, '<TEST$1>')

lancer 11.07.2013 14:14

Цитата:

Сообщение от bes (Сообщение 261669)
это как, на одном месте одновременно и одно и другое что ли
в том и смысл, что на одном месте либо одно, либо другое

задачу опиши точнее

В первом топике описана задача, там все предельно ясно, скорее всего невнимательно прочел. Она уже решена, спасибо Deff'y.

Сейчас остались вопросы начиная с этого поста про скобки.

В ответе MiksIr не вижу ответа на вопросы, про те скобки в том числе.

MiksIr ответил:
Цитата:

Скобки - это еще и выделение под-совпадений, которые вы можете использовать дальше в коде, или использовать в замене. Например, text.replace(/<A([^>]*)>/, '<TEST$1>')
Там дальше как раз таки ничего не используется и группировать на мой взгляд нечего, поэтому и спрашиваю.

MiksIr 11.07.2013 14:17

Зануда. Конкретно по тому посту - скобки там не нужны.


Часовой пояс GMT +3, время: 07:14.