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

tsigel 30.08.2013 12:06

Регулярное выражение и метод test
 
В продолжении темы.

Для тех кому не охота лезть в ту тему:
Делаем просмотр версий 2-х документов.

Задача отобразить на странице 2 похожие формы, сравнить их содержимое и выделить цветом отличия. Для решения данной задачи, я забрал содержимое форм, разбил текст на массив с помощью:
var re = /([~!$%^&*()_+|`\-=\\\[\]{};':",\.\/<>?@#])/g;
text1 = text1.replace(re, ' $1').split(' ');

(Спасибо devote за регулярное выражение, в коих я очень слаб).

Все сработало шикарно, и теперь мне надо из измененных массивов склеить обратно строку, так, чтобы перед знаками препинания не было пробелов. То есть просто
text1 = text1.join(' ');

мне не подходит.

Я написал:
function myJoin(arr) {
            var str = "";

            for (var i = 0; i < arr.length; i++) {

                if (/([~!$%^&*()_+|`\-=\\\[\]{};':",\.\/<>?@#])/g.test($(arr[i]).text()) || (i == 0)) {
                    str = str + arr[i];
                } else {
                    str = str + " " + arr[i];
                }

            }

            return str;
        }

        text1 = myJoin(text1);
        text2 = myJoin(text2);


Но, я столкнулся с проблемой. Вывод с консоли:
//re = /([~!$%^&*()_+|`\-=\\\[\]{};':",\.\/<>?@#])/g
re.test(".")
true
re.test(".")
false
re.test(".")
true
re.test(".")
false
re.test(".")
true
re.test(".")
false


Как одно и то же регулярное выражение одним и тем-же методом выдает то true, то false?

tsigel 30.08.2013 12:59

Небольшой пример, чтобы было нагляднее:
alert(/([~!$%^&*()_+|`\-=\\\[\]{};':",\.\/<>?@#])/g.test("."));
alert(/([~!$%^&*()_+|`\-=\\\[\]{};':",\.\/<>?@#])/g.test("."))
alert(/([~!$%^&*()_+|`\-=\\\[\]{};':",\.\/<>?@#])/g.test("."))
alert(/([~!$%^&*()_+|`\-=\\\[\]{};':",\.\/<>?@#])/g.test("."))

var re = /([~!$%^&*()_+|`\-=\\\[\]{};':",\.\/<>?@#])/g;
alert(re.test("."));
alert(re.test("."));
alert(re.test("."));
alert(re.test("."));


В чем разница? Почему разные результаты?

edison 30.08.2013 13:41

потому что после первой проверки находит точку и смещает индекс, ищет дальше, а дальше точек нету)) как не находит ничего сбрасывает индекс и по новой. У тебя же модификатор g.
var re = /([~!$%^&*()_+|`\-=\\\[\]{};':",\.\/<>?@#])/g;
alert(re.test("..")); //true
alert(re.test("..")); //true
alert(re.test("..")); //false
alert(re.test("..")); //true


var re = /([~!$%^&*()_+|`\-=\\\[\]{};':",\.\/<>?@#])/g;
re.lastIndex=0;
alert(re.test(".")); //true
re.lastIndex=0;
alert(re.test(".")); //true
re.lastIndex=0;
alert(re.test(".")); //true
re.lastIndex=0;
alert(re.test(".")); //true


var re = /([~!$%^&*()_+|`\-=\\\[\]{};':",\.\/<>?@#])/;
alert(re.test(".")); //true
alert(re.test(".")); //true
alert(re.test(".")); //true
alert(re.test(".")); //true

tsigel 30.08.2013 13:47

edison,
Спасибо.


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