Проб: я получаю ответ AJAX (JSON или открытый текст с разрывами строк). Каждый элемент ответа должен быть проверен с помощью RegEx, чтобы узнать, соответствует ли он указанному пользователю прерыванию или нет.
Пример:
Ajax Response (обычный текст)
"Aldor
Aleph
Algae
Algo
Algol
Alma-0
Alphard
Altran"
Пользовательский шаблон:
/^Alg/ig.test(responseItem)
Результаты RegExp должны выглядеть так:
Aldor // false
Aleph // false
Algae // true
Algo // true
Algol // true
Alma-0 // false
Alphard // false
Altran // false
Но каждый раз, когда я получаю разные (и какие-то пронумерованные) результаты... например. (/^alg/ig.test("Algo")
= > false)
Мой код:
HTML
...
<form>
<input id="in" />
</form>
<div id="x">
Aldor
Aleph
Algae
Algo
Algol
Alma-0
Alphard
Altran
</div><button id="checker">check!</button>
...
JavaScript (jQuery 1.6.2)
$(function(){
var $checker = $('#checker');
$checker.click(function(ev){
var inputFieldVal = $.trim($('#in').val());
console.log(inputFieldVal); // Alg
var regExpPattern = '^'+inputFieldVal,
re = new RegExp(regExpPattern, 'igm');
onsole.log(re); // /^Al/gim
// Get text out of div#x
var text = $('#x').text();
// Trim and 'convert' to an array...
text = $.trim(text).split('\n');
console.log(text); // ["Aldor", "Aleph", "Algae", "Algo", "Algol", "Alma-0", "Alphard", "Altran"]
for (var index=0, upper=text.length;index<upper;++index) {
console.log(
re.test(text[index]),
text[index]
);
}
});
})
Консоль OUTPUT:
/^Alg/ig
= > должен соответствовать каждому элементу, который начинается с Alg
false "Aldor"
false "Aleph"
true "Algae"
false "Algo" //Why ? O.o
true "Algol"
false "Alma-0"
false "Alphard"
false "Altran"
/^Al/ig
= > должен соответствовать каждому элементу, потому что каждый элемент начинается с Al
true "Aldor"
false "Aleph" //Why ? O.o
true "Algae"
false "Algo" //Why ? O.o
true "Algol"
false "Alma-0" //Why ? O.o
true "Alphard"
false "Altran" //Why ? O.o
Любые предложения?
Это обычное поведение, которое демонстрируют методы exec или test при работе с шаблонами с глобальным флагом g
.
Объект RegExp
будет отслеживать lastIndex
, где совпадение найдено, а затем в последующих совпадениях оно начнется с этого lastIndex
, а не начиная с 0
.
Например:
var re = /^a/g;
console.log(re.test("ab")); // true, lastIndex was 0
console.log(re.test("ab")); // false, lastIndex was 1
Удалите флаг g
из вашего шаблона, поскольку вы ищете только одно совпадение (вы тестируете каждую строку отдельно).
Вам нужно удалить глобальный флаг "g".
попробуйте это ~
var str = "Aldor\rAleph\rAlgae\rAlgo\rAlgol";
var myregexp = /^alg.*$/img;
var match = myregexp.exec(str);
while (match != null) {
for (var i = 0; i < match.length; i++) {
alert(match[i]);
}
match = myregexp.exec(str);
}
Это было пустое пространство, которое не соответствовало ему:
попробуйте следующее:
$(function(){
var $checker = $('#checker');
$checker.click(function(ev){
var inputFieldVal = $.trim($('#in').val());
console.log(inputFieldVal); // Alg
var regExpPattern = '^'+inputFieldVal,
re = new RegExp(regExpPattern, 'igm');
console.log(re); // /^Al/gim
// Get text out of div#x
var text = $('#x').text();
// Trim and 'convert' to an array...
text = $.trim(text).split('\n');
console.log(text); // ["Aldor", "Aleph", "Algae", "Algo", "Algol", "Alma-0", "Alphard", "Altran"]
for (var index=0, upper=text.length;index<upper;++index) {
console.log(
re.test(text[index].trim()),
text[index]
);
}
});
})
здесь jsfiddle:
/^alg/ig.test("Algo")
ли/^alg/ig.test("Algo")
буквально иfalse
?