2012-03-29 4 views
1

Я пытаюсь сопоставить 3 или более последовательных вхождения одного или нескольких специальных символов из набора в строке.Соответствие нескольких вхождений последовательных символов из набора

my js: 
var exp = new RegExp("^[\^\$\*%#`!]{3}+$"); 
return !exp.test(myString); 

Не работает. Любая помощь будет оценена.

this i$ a te$t: false 
th!$ a te$t: false 

th!s is a ^%* test: true 
as it has 3 consecutive characters from my set '^%*' 

this is a ^%^&%&%& test: true 
as it has 3 or more consecutive characters from my set 

EDIT:

Я исправил регулярное выражение. Это в JavaScript

var exp = new RegExp("[\^$%#`]{3}"); return exp.test(myString); 

Почему он говорит, что это совпадение? %^$^$^$^&^&^&%

Этот вход имеет 2 символов и имеет место между ними.

+0

ваше регулярное выражение недействительно, вы не можете иметь '+' после '{3}' это как сказать: «Я хочу его ровно 3 раза, но также допустимо 1 или более раз». – Robbie

+0

в вашем обновлении, что соответствует, потому что у вас есть пробел в наборе символов .... проверьте мой ответ ниже ... Я протестировал его и, похоже, работает – Robbie

ответ

2

Я думаю, что вы хотите

/[\^$*%#`!]{3,}/ 
== new RegExp("[\\^$*%#`!]{3,}") 

Ваша строка должна иметь вхождение этих персонажей, не состоят из них. Кроме того, мне кажется странным .{3}+.


EDIT (ответить на ваш расширенный вопрос):

Кроме того, если вы хотите избежать^с помощью обратной косой черты, вам придется экранировать саму обратную косую черту в строке для вашего RegExp конструктора. Ваш new RegExp("[\^$%#']{3}") равен /[^$%#']{3}]/, что соответствует последовательности "^ &".

+0

Я думаю, вам нужно избегать '^' в наборе символов – Robbie

+0

, но в его примере он тоже этого не сделал. – Bergi

2

Вы ищете только 3 символа между символами^и $ строки. Вы хотите, чтобы на каждом конце была сделана. *? (или просто оставьте^и $).

http://regexpal.com/ всегда полезно.

+0

http://rubular.com/ является хорошим друг! – alextercete

3
new RegExp("[\^\$\*%#`!]{3}"); 

Ведущий ^ показал, что шаблон должен начинаться в начале строки. В конце $ указано, что шаблон должен заканчиваться в конце строки. Комбинация из них указала бы, что единственное допустимое соответствие - это строка, состоящая только из ваших специальных символов.

Наконец, + не является необходимым, как только вы найдете первые 3 последовательных специальных символа, все готово; что он может соответствовать 5, не имеет значения.

+0

см. Обновление выше – kheya

1

Попробуйте это:

Regex:

/[\^$*%#`!]{3,}/ 

Javascript Тесты:

var result = new RegExp(/[\^$*%#`!]{3,}/).test("%^ $^ $^ $^ &^ &^ & %"); 
// result now "false" 
new RegExp(/[\^$*%#`!]{3,}/).test("th!s is a ^%* test"); 
// result is now "true" 

Я удалил недопустимые + и некоторые ненужные символы побега. О, и, как было предложено другими пользователями, Анкеры ^$ не нужны.

Вы можете, однако, обернуть регулярное выражение в тегах \b, если вы хотите ограничить соответствие границам слов (чтобы он не совпал в середине набора символов - только если набор сам по себе)

Смежные вопросы