2013-06-27 2 views
0

У меня есть строка characters, которая содержит разрешенные символы. Я хотел бы проверить другую строку (input), если она имеет значения только из characters.Javascript: используйте регулярное выражение, чтобы проверить, имеет ли строка значения только из другого?

Я не знаю, если это возможно, но ищем решение, которое использует regex и match(), чтобы определить, допускают ли только символы ввода.

ответ

1

JS fiddle

уступи идти. Успех будет выполняться, когда тестовая строка содержит только допустимые символы. Это чувствительно к регистру.

var allowedCharacters = "abcdefghijklmnopqrstuvwxyz"; 
var regex = new RegExp("^[" + allowedCharacters + "]*$"); 
var testString = "abc#@#"; 
var success = regex.test(testString); 

Для случая в-чувствительных заменить соответствующую строку следующим образом. Это добавляет модификатор regex.

var regex = new RegExp("^[" + allowedCharacters + "]*$", "i"); 

Если у вас есть специальные символы в переменной allowedCharacters, вы должны избегать их с помощью двойной косой черты. Таким образом, чтобы использовать символ квадратной скобки, вы должны использовать.

var allowedCharacters = "abc\\["; 

Это происходит потому, что первый обратный слэш для строки побега и второй, чтобы сделать его побег в регулярном выражении.

+1

вам нужно обратить внимание на специальные символы здесь (например, 'allowed =" ab-x "') – georg

+0

Правильно Я обновлю, чтобы это объяснить. – Ally

+0

Я не знаю, но это, похоже, не работает на меня. Разрешенные символы: 'abcdefghijklmnopqrstuvwxyz', однако он возвращает true, если' testString' 'abC# @ #'. :(Что случилось? – gen

2

Вы можете использовать RegExp конструктор для создания регулярного выражения из строки:

function validStringUnsanitized(allowed, str) { 
    var re = new RegExp("^[" + allowed + "]+$"); 
    return re.test(str); 
} 

> validStringUnsanitized('abx', 'abx'); 
true 
> validStringUnsanitized('abx', 'ght'); 
true 

Но если вы хотите, чтобы специальные символы, вам необходимо дезинфицировать разрешенную один. В противном случае вы получите нежелательные результаты:

// the regex becomes [ab-x] which is from a to x 
> validStringUnsanitized('ab-x', 'ghai'); 
true 
> validStringUnsanitized(']ab', 'ab'); 
false 

Таким образом, вы должны избежать некоторых символов, как это:

function validString(allowed, str) { 
    var sanitized = allowed.replace(/([\]\-\\])/g, '\\$1') 
    var re = new RegExp("^[" + sanitized + "]+$"); 
    return re.test(str); 
} 

> validString(']ab-x\\[', 'abxaabbx'); 
true 
> validString(']ab-x\\[', 'ab-\\xb[]ab'); 
true 
> validString(']ab-x\\[', 'ghai'); 
false 

JSFiddle

+0

видеть мой комментарий к @Ally – georg

+0

Вы правы. Добавлено несколько примеров, чтобы показать проблему. – ahilsend

0

Вы можете сделать это с помощью этой функции

http://jsfiddle.net/SXeTJ/

var allowed = 'abcdef'; 

function CheckAllowedWithRegex(str,allowed){ 
    var pattern = new RegExp("[^"+allowed+"]"); 
    return str.match(pattern) == null; 
} 

var str1 = 'aaabcc'; 
var str2 = 'aavbllkwqxx'; 

alert( CheckAllowedWithRegex(str1,allowed)); // output is true 

alert( CheckAllowedWithRegex(str2,allowed)); // output is false 
1

В случае, если вы хотите, чтобы избежать использования регулярных выражений, вы могли бы рассмотреть что-то вроде:

var valid_chars = ['a', 'e', 'i', 'o', 'u', 'y'], 
    ret; 

//or valid_chars = string.split(''); 

ret = isValid('test', valid_chars); //false 
ret = isValid('aeyaa', valid_chars); //true 
ret = isValid('aeyaab', valid_chars); //false 

function isValid(input, check) 
{ 
    if (typeof input === 'string') 
     input = input.split(''); 

    if (typeof check === 'string') 
     check = input.split(''); 

    if (typeof input !== 'object') 
    { 
     console.log('isValid() failed: input not array'); 
     return; 
    } 

    if (typeof check !== 'object') 
    { 
     console.log('isValid() failed: check not array'); 
     return; 
    } 


    for (var x = 0; x < input.length; ++x) 
    { 
     var char_isvalid = false; 

     for (var y = 0; y < check.length; ++y) 
     { 
      if (input[x].toLowerCase() === check[y].toLowerCase()) 
      { 
       char_isvalid = true; 
       break; 
      } 
     } 

     if (! char_isvalid) 
     { 
      return false; 
     } 
    } 

    return true; 
}