Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярное выражение (https://javascript.ru/forum/misc/59923-regulyarnoe-vyrazhenie.html)

FoxTrix 03.12.2015 13:08

Регулярное выражение
 
Добрый день.
Возникла проблема при написании регулярного выражения.

Регулярное выражение должно находить квадратные скобки в строке, если внутри них есть любое кол-во любых символов, кроме букв.

С этим проблем не возникло, получилось следующее выражение
/^(\[(?:[^A-Za-z]+)?\])/g.test('[test]%#$%^') // false


Но потребовалось, чтобы оно так же возвращало false, если внутри скобок находится 4 или больше точки
reg.text('[...]#$%%') // true
reg.text('[...#]#$%%') // true
reg.text('[....]#$%%') // false


попробовал что-то такого вида
^(\[((?:[^A-Za-z]+)|(?!([\.]{4,})))?\])

(в более читаемом виде)

^(\[
	(
		(?:[^A-Za-z]+) | (?!([\.]{4,}))
	)?
\])

но оно не даёт нужного результата.

Помогите модифицировать чтобы подходило по требованиям.
Заранее спасибо.

Mess4me 03.12.2015 13:22

FoxTrix,
а кусок HTML можно с того что выборку делаете ?

FoxTrix 03.12.2015 14:06

Цитата:

Сообщение от Mess4me (Сообщение 398534)
FoxTrix,
а кусок HTML можно с того что выборку делаете ?

Генерируемая строка заполненная спец символами, 12 символов длинной, для примера

?.}]]’]-@_|%
(:.]/:!\.$"#
_[$]~+"|%\’:
<>.>,?_>%$$=
{}_;("<_)(|:

Mess4me 03.12.2015 14:13

FoxTrix,
какой результат должен получиться?
<script>

    //Регулярное выражение должно находить квадратные скобки в строке, если внутри них есть любое кол-во любых символов, кроме букв.
     var reg = /^(\[(?:[^A-Za-z]+)?\])/g;
    console.log(reg.test('[test]%#$%^')); // ??
    console.log(reg.test('[...]#$%%') );// ??
    console.log(reg.test('[...#]#$%%')); // ??
    console.log(reg.test('[....]#$%%')); // ??

</script>

FoxTrix 03.12.2015 14:15

Mess4me,
<script>

    //Регулярное выражение должно находить квадратные скобки в строке, если внутри них есть любое кол-во любых символов, кроме букв.
     var reg = /^(\[((?:[^A-Za-z]+)|(?!(\.{4,})))?\])/g;
    console.log(reg.test('[test]%#$%^')); // false
    console.log(reg.test('[...]#$%%') );// true
    console.log(reg.test('[...#]#$%%')); // true
    console.log(reg.test('[....]#$%%')); // false

</script>

FoxTrix 03.12.2015 15:04

Mess4me,
Только так как вы написали, будет неверные результаты теста выводить, т.к.
http://javascript.ru/forum/270058-post3.html

Сейчас тестировал, столкнулся с этой проблемой =)

Mess4me 03.12.2015 15:11

FoxTrix,
интересно поведение )
наверное в Вашем варианте лучше сделать это в два этапа.
Получить результат (всё кроме букв) , применить новый рег к результату с точками.
И не мучатся)

FoxTrix 03.12.2015 15:43

Mess4me,
Да, видимо придется написать как-то так
matches = /^(\[(?:[^A-Za-z]+)?\])/g.exec('[....]#$%%');
if(matches != null && !/\.{4,}/g.test(matches[0])) {
	
}


Спасибо за помощь =)

pnpquest 03.12.2015 15:57

Цитата:

Сообщение от FoxTrix
Сейчас тестировал, столкнулся с этой проблемой =)

Помимо того способа, который по Вашей ссылке, сбрасывания lastIndex, можно перекомпилировать регулярку при каждом вызове

re = function(){ return /./g }

s = "."

console.log(re().test(s))
console.log(re().test(s))
console.log(re().test(s))

//или

console.log(/./g.test(s))
console.log(/./g.test(s))
console.log(/./g.test(s))

правда, не знаю как это скажется на производительности.


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