JavaScript RegExp.test () возвращает false, даже если он должен возвращать true

12

Проб: я получаю ответ 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

Любые предложения?

  • 1
    /^alg/ig.test("Algo") ли /^alg/ig.test("Algo") буквально и false ?
  • 0
    PS Суть всего этого в том, что я хочу не только сопоставлять элементы из ответа, но и иметь возможность их собирать.
Показать ещё 4 комментария

4 ответа

22
Лучший ответ

Это обычное поведение, которое демонстрируют методы 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 из вашего шаблона, поскольку вы ищете только одно совпадение (вы тестируете каждую строку отдельно).

3

Вам нужно удалить глобальный флаг "g".

1

попробуйте это ~

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);
}
0

Это было пустое пространство, которое не соответствовало ему:

попробуйте следующее:

$(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:

http://jsfiddle.net/9Gqw2/

  • 0
    Кажется, у меня та же странная проблема, что и у моего сценария. Я только что проверил вашу версию и получил тот же результат ....

Ещё вопросы

Сообщество Overcoder
Наверх
Меню