1 (изменено: stir, 2011-02-03 14:17:46)

Тема: JScript: переменные в регвыр

Конек" JavaScript заключается в регулярных выражениях, несомненно, но вот у меня ошибка видать закралась, непонял где вот только, перелопатил кучу литературы и непонял где именно...

//var re = new RegExp("^.*"+a11+"\."+a22+"\."+a33+a44+"\.[0-9]*\..*$", "i");

или даже так

var re = new RegExp(".*"+a11+"\."+a22+"\."+a33+a44+"\.[0-9]*\..*", "i");

где a11- запись типа ффф|ффа|ффы ; а22 - 01|03|41|88; а33 - 0141|0142|0045 ; a44="....."

Скрипт нехочет читать строки из тектового файла, а строки такого типа:
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_005.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_006.1.tif
\\serverpko\arhiv\scan\25605\25605as\1\ASW.01.0141_0142.25605.062_001.tif
\\serverpko\arhiv\scan\25605\25605em\EMW.01.0141_0142.25605.010_002.tif
\\serverpko\arhiv\scan\25605\25605tx\TXW.01.0140A0000.25605.032_031.tif


Код записи в файл для отображения в конце поискового модуля такой:

function regsrchbaza(re) {
var nb=nm=0;
var fso8 = new ActiveXObject("Scripting.FileSystemObject");// проверка доступности сервера
var b1 = fso8.FolderExists(name6); // true, если данная папка существует
if (b1==false)alert("Папка архива или сервер недоступны");
else{
    var fso5 = new ActiveXObject("Scripting.FileSystemObject");
    fso5.CopyFile(name29, name20);//копируем 700 файл
    var fso701 = new ActiveXObject("Scripting.FileSystemObject");
    var f701 = fso701.CreateTextFile(name701, true, false); //созхдаем лог 1
    f701.Close();
    var fso702 = new ActiveXObject("Scripting.FileSystemObject");
    var f702 = fso702.CreateTextFile(name702, true, false); //созхдаем лог 2
    f702.Close();
    
    //  body поиск    
    var fso700 = new ActiveXObject("Scripting.FileSystemObject");
    var f700 = fso700.OpenTextFile (name20, 1, false);
        while (!f700.AtEndOfStream){
                 var axtext =f700.ReadLine();
                 if (!/re/.test(axtext)){
             var fso701 = new ActiveXObject("Scripting.FileSystemObject");
             var f701 = fso701.OpenTextFile(name701, 8);
             f701.WriteLine(axtext);
                         f701.Close();
             ++nb;
             }
                 else {
                  var fso702 = new ActiveXObject("Scripting.FileSystemObject");
             var f702 = fso702.OpenTextFile(name702, 8);
             f702.WriteLine(axtext);
                         f702.Close();
             ++nm;
             }        
        }
    f700.Close();
    alert ("Совпадений= "+nb+"  Пропущено= "+nm);
    //alert ("образец re= "+re+"последний из axtext= "+axtext);
     alert ("записаны 2 файла отчета на диск с");
    }

}

Включил создание логов для наглядности, но поиск получается вообще не производится, ничего не отсеялось...

Вывел значение регвыр=
/.*AWW|ARW|ASW|VKW|GPW|GSN|KGW|KMW|KMD|MWW|NVW|NVK|NKW|OVW|OSW|PBW|PGW|PSW|PTW|SSW|TKW|TSW|TXW|EMW|ENW|EOW|ESW.01|03|04|05|06|09.0140|0141|0143|0144|0145|0147|0180|0255......[0-9]*..*/i

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

Любители построили Ковчег, а профессионалы - Титаник.

2

Re: JScript: переменные в регвыр

2stir, не называйте пожплуйста JScript Javascript-ом, хоть у них одни корни, но все-таки не одно и тоже.
Еще хотел спросить, а зачем так часто писать в коде " ActiveXObject("Scripting.FileSystemObject");". Достаточно создать 1 раз и потом пользоватся.
И еще вот спросить хотел, не понял чуток вас.
Нужно из этих строк

stir пишет:

Скрипт нехочет читать строки из тектового файла, а строки такого типа:
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_005.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_006.1.tif
\\serverpko\arhiv\scan\25605\25605as\1\ASW.01.0141_0142.25605.062_001.tif
\\serverpko\arhiv\scan\25605\25605em\EMW.01.0141_0142.25605.010_002.tif
\\serverpko\arhiv\scan\25605\25605tx\TXW.01.0140A0000.25605.032_031.tif

вытащить строки в которых встречается "AWW|ARW|ASW|VKW|GPW|GSN|KGW|KMW|KMD|MWW|NVW|NVK|NKW|OVW|OSW|PBW|PGW|PSW|PTW|SSW|TKW|TSW|TXW|EMW|ENW|EOW|ESW....."
то есть исключить строки с другой последовательностью символов кроме указанных выше.


Или вообще, из какой то кучи строк, вытащить строки вида

\\serverpko\arhiv\scan\25605\25605tx\[три буквы].[две цифры].[цифры].....


?

В общем не совсем понял вашу задачу. Надеюсь понятно объяснил.

Нас невозможно сбить с пути, нам пофигу куда идти.

3

Re: JScript: переменные в регвыр

DnsIs, думаю, что в данном случае вопрос имеет отношение в-общем только к JavaScript и не затрагивает особенностей JScript. Относительно данной задачи, видимо стоит уточнить требования к поиску. Может быть, надо найти все строки, содержащие, например, подстроки "25605"?

( 2 * b ) || ! ( 2 * b )

4 (изменено: stir, 2011-02-04 07:38:44)

Re: JScript: переменные в регвыр

Хорошо, теперь и в дальнейшем не буду сокращать JavaScript как JS.
Задача такова: пользователь выбирает с помощью чекбоксов категории, номера цехов и номера зданий, далее происходит проверка, чтобы хотябы 1 чекбокс был отмечен в них (3 группы в 1 форме), далее я считываю в массив значения отмеченных чекбоксов -
из категорий, вот пример полного: AWW|ARW|ASW|VKW|GPW|GSN|KGW|KMW|KMD|MWW|NVW|NVK|NKW|OVW|OSW|PBW|PGW|PSW|PTW|SSW|TKW|TSW|TXW|EMW|ENW|EOW|ESW
аналогично поступаю с цехами и зданиями, в итоге мы имеем 3 массива с выбранными значениями для поиска.
Группа категорий имеет 3 буквы, цеха только 2 цифры и номера зданий -  9 символов, у зданий имеет вес только первые 4 символа (обычно цифры), поэтому я разбил этот блок в поиске на 2 части в регулярном выражении. В куске: +а11+.+а22+.+а33+а44+.+  а11-категория, а22-номер цеха, а33-первая часть номера здания, а44- вторая часть неизменная (5 точек в регвыр)...
База поиска готова, как я привел выше несколько строк, и из нее надо создать список подходящих данных по имеющимся данным из этих 3 массивов.
В базе поиска файл имеет вид 3буквы+точка+2цифры+блок из9символов+точка+номер проекта+точка+число страниц проекта+подчеркивание нижнее+текущая страница проекта(+символы)+точка+расширение ТИФФ

В базе содержится полный путь к файлу перед именем, который нужен для быстрого перехода к файлу в выведенном после поиска списке... поэтому я в регвыражении ввел начало строки+любой символ+*.
А "\" можно отнести в регвыр под символ "*" ??, может из-за этого у меня нестыковка..хотя вряд ли.

Сейчас попробую жестко задать одлин из вариентов регвыр и провести поиск... а к 25605 привязываться пока не стоит, это просто в наличии пока 1 проект для теста.
ПС: у меня получится, как и задумывал 3 пути поиска в архиве, и 2 базы тхт + расшаренная папка с файлами. Вчера предположили, что за 2 выговора будут уже увольнять и т.п. - но все фигня, еще и ночью можно подумывать, "Убьюсь, но найду ошибку эту!!! (ОФФ)/ наверное мой принцип жизни - всего добиваться, /"

Кажется косяк мог быть тут:

var re = new RegExp(".*"+a11+"\."+a22+"\."+a33+a44+"\.[0-9]*\..*", "i");

когда регвыр. передаем в

    if (!/re/.test(axtext)){

Вообщем в итоге должно получиться так:
если пользователь выбрал в категориях - AWW
в цехе - 01
здание номер - 0141, то
в списке должны появиться ссылки на файлы:
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_002.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_003.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_004.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_005.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_006.1.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_007.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_008.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_009.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_010.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_011.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_012.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_013.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_014.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_015.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_016.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_017.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_018.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_019.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_020.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_021.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_022.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_023.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_024.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_025.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_026.tif

Если пользователь выберет что-то еще - то список должен быть еще длиннее...

Модуль вывода ссылок-списка у меня готов. Он выводит данные из тхт файла 701. Также отлично функционирует модуль формирования 3 массивов из отмеченных чекбоксов пользователем.

Любители построили Ковчег, а профессионалы - Титаник.

5

Re: JScript: переменные в регвыр

    //  body поиск    
    var fso700 = new ActiveXObject("Scripting.FileSystemObject");
    var f700 = fso700.OpenTextFile (name20, 1, false);
        while (!f700.AtEndOfStream){
                 var axtext =f700.ReadLine();
                 if (!/.*AWW|ASW.*/.test(axtext)){
             var fso701 = new ActiveXObject("Scripting.FileSystemObject");
             var f701 = fso701.OpenTextFile(name701, 8);
             f701.WriteLine(axtext);
                         f701.Close();
             ++nb;
             }
                 else {
                  var fso702 = new ActiveXObject("Scripting.FileSystemObject");
             var f702 = fso702.OpenTextFile(name702, 8);
             f702.WriteLine(axtext);
                         f702.Close();
             ++nm;
             }        
        }
    f700.Close();
    alert ("Пропущено= "+nb+"  Совпадений= "+nm);
    alert ("записаны 2 файла отчета на диск с");

Это работает. Значит с рег.выражением что-то надо сделать.. думаю как ввести данные из переменной..есть идея! сейчас проверю..

Любители построили Ковчег, а профессионалы - Титаник.

6 (изменено: stir, 2011-02-04 08:43:08)

Re: JScript: переменные в регвыр

а если ввести до функции

var re = '.*AWW|ASW.*'

передать в функцию re
в блок

if (!/re/.test(axtext)){

то не работает.:(

Странно, вводишь вместо re его значение - работает, если переменную re - непашет.

Если написать var re = .*AWW|ASW.*; возникает, как и положенно синтаксическая ошибка...:rolleyes:


Ничего не получилось, переменная re передается текстом и из-за этого наверное в блоке с циклом невоспринимается значение переменной... попробую изменить способ написания регвыр в цикле...

Любители построили Ковчег, а профессионалы - Титаник.

7 (изменено: stir, 2011-02-04 09:10:45)

Re: JScript: переменные в регвыр

Работает так:

var re = '.*AWW|ASW.*';

и

if (!RegExp(re).test(axtext)){

Осталось подкорректрировать логику выборки, а то у меня получилось вместо а11 и а22 и а33+а44 - а11 или а22 или а33+а44 , а то много лишнего выбирается.

Спасибо за участие, Господа!

Любители построили Ковчег, а профессионалы - Титаник.

8 (изменено: DnsIs, 2011-02-04 10:57:40)

Re: JScript: переменные в регвыр

2stir, если я вас правильно понял то:
blablabla.hta

 <html>
   <head>
    <meta http-equiv=Content-Type Content="text-html; charset=Windows-1251">
    <title>Sample Application</title>
    <hta:application
        id=name
        applicationname=myApp
        innerborder=no
        borderstyle=normal
        border=thin
        caption=yes
        contextmenu=no
        selection=no
        icon=""
        maximizebutton=yes
        minimizebutton=yes
        scroll=no
        scrollflat=no
        showintaskbar=no
        singleinstance=yes
        sysmenu=yes
        version=1.0
        windowstate=normal />
    <style>
    #message {
        position: absolute;
        top: 10px;
        left: 10px;
        border: 1px solid #777;
        width: 920;
        height: 250;
        overflow: auto;
    }
    #frm {
        position: absolute;
        top: 270px;
        left: 10px;
        border: 1px solid #777;
        width: 920;
        height: 110;
    }
    #rez {
        position: absolute;
        top: 390px;
        left: 10px;
        border: 1px solid #777;
        width: 920;
        height: 250;
        overflow: auto;
    }
    </style>
    <script language="JavaScript">
    function dataload() {
        fso = new ActiveXObject("Scripting.FileSystemObject");
        s="";
        var f = fso.OpenTextFile ("text.txt", 1, false);
        while (!f.AtEndOfStream){s += f.ReadLine() + "<br>";}
        f.Close();

        document.getElementById("message").innerHTML=s;
        }
        function sel (form){
            reg1="";reg2="";reg3="";
            if (form.option1.checked) reg1="AWW";
            if (form.option2.checked) {
                if (reg1=="") {reg1+="AWG"} else {reg1+="|AWG"};
            }  
            if (form.option3.checked) reg2="01";
            if (form.option4.checked) {
                if (reg2=="") {reg2+="02"} else {reg2+="|02"};
            }
            if (form.option5.checked) reg3="0141";
            if (form.option6.checked) {
                if (reg3=="") {reg3+="0142"} else {reg3+="|0142"};
            }
            var f = fso.OpenTextFile ("text.txt", 1, false);
            s="";
            reg = new RegExp(".*("+reg1+").*("+reg2+").*("+reg3+").*", "i")
            while (!f.AtEndOfStream){
                next = f.ReadLine();
                if (next.match(reg)) {
                    s += next + "<br>";
                }
            }
            f.Close();
        document.getElementById("rg").innerHTML = "Отбор по регулярному выраению: <font color= red>" + reg + "</font>";
        document.getElementById("rez").innerHTML = s;
                    
        }
    </script>
</head>

<body bgcolor="#000000" alink="red" vlink="blue" link="blue" text="ffffff" onload="dataload()">
    <div id="message">Ожидаем...</div>
<div id="frm">
    <form name="first">
       <table><tr><td><input type="checkbox" name="option1" value="a1">AWW</td>
       <td><input type="checkbox" name="option3" value="b1">01</td>
       <td><input type="checkbox" name="option5" value="c1">0141</td></tr>
       <tr>
       <td><input type="checkbox" name="option2" value="a2">AWG</td>
       <td><input type="checkbox" name="option4" value="b2">02</td>
       <td><input type="checkbox" name="option6" value="c2">0142</td>
       </tr></table>
       
       <input type="button" name="button2" value="Отправить запрос" onclick="sel(this.form)">
    </form>
    <div id=rg></div>
</div>    
<div id="rez"></div>    
</body>
</html>

text.txt

\\serverpko\arhiv\scan\25605\25605a\AWW.02.0141_0142.25605.026_005.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_006.tif
\\serverpko\arhiv\scan\25605\25605a\AWG.02.0141_0142.25605.062_001.tif
\\serverpko\arhiv\scan\25605\25605e\AWG.01.0141_0142.25605.010_002.tif
\\serverpko\arhiv\scan\25605\25605t\AWG.01.0142_0142.25605.032_031.tif
\\serverpko\arhiv\scan\25605\25605a\AWG.01.0141_0142.25605.026_009.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.02.0141_0142.25605.026_010.tif
\\serverpko\arhiv\scan\25605\25605a\AWG.01.0141_0142.25605.026_011.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.02.0141_0142.25605.026_012.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_013.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_014.tif
\\serverpko\arhiv\scan\25605\25605a\AWG.01.0142_0142.25605.026_015.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_016.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0142_0142.25605.026_017.tif
\\serverpko\arhiv\scan\25605\25605a\AWG.02.0141_0142.25605.026_018.tif
\\serverpko\arhiv\scan\25605\25605a\AWW.01.0141_0142.25605.026_019.tif
\\serverpko\arhiv\scan\25605\25605a\AWG.01.0141_0142.25605.026_020.tif

В верхней части, отображается исходный файл, в нижней результат поиска.

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

.*().*(01).*(0141|0142).*/ найдет и строку
\\serverpko\arhiv\scan\25605\25605a\AWW.02.0141_0142.25605.026_010.tif
Хотя по идее она нам не нужна. Но для более точного составления, повторюсь, нужно увидеть побольше исходных данных, ибо у вас встречаются строки и вот какие ...TXW.01.0140A0000.25605.032_031.tif...

Надеюсь хоть частично вам помог.

Нас невозможно сбить с пути, нам пофигу куда идти.

9

Re: JScript: переменные в регвыр

Да и еще, тут как то многоуважаемый jite, кажется писал, что метод регсэпов test глючит. Подробностей не знаю правда, спросите у него, если интересно.

Нас невозможно сбить с пути, нам пофигу куда идти.

10

Re: JScript: переменные в регвыр

DnsIs, спасибо.
У меня форма построена чуток подругому, . Но ведь постоянное улучшение еще никто не отменял, и потому в ближайшее (все относительно) я займусь улучшением своего труда с помощью и ваших идей, которые здесь мне написали Вы за это время...
Для ознакомления я бы мог скинуть часть всего проекта, но не сюда... и это простой (пока что) htm, но в глобальном проекте созданном при помощи SiteBuilder 1.96.2.

Любители построили Ковчег, а профессионалы - Титаник.

11 (изменено: DnsIs, 2011-02-04 11:01:23)

Re: JScript: переменные в регвыр

В коде выше замените функцию на вот эту

        function sel (form){
            reg1="";reg2="";reg3="";
            if (form.option1.checked) reg1="AWW";
            if (form.option2.checked) {
                if (reg1=="") {reg1+="AWG"} else {reg1+="|AWG"};
            }  
            if (form.option3.checked) reg2="01";
            if (form.option4.checked) {
                if (reg2=="") {reg2+="02"} else {reg2+="|02"};
            }
            if (reg2=="") reg2="[0-9]{2}";
            if (form.option5.checked) reg3="0141";
            if (form.option6.checked) {
                if (reg3=="") {reg3+="0142"} else {reg3+="|0142"};
            }
            var f = fso.OpenTextFile ("text.txt", 1, false);
            s="";
            reg = new RegExp(".*("+reg1+")\\.("+reg2+")\\.("+reg3+").*", "i")
            while (!f.AtEndOfStream){
                next = f.ReadLine();
                if (next.match(reg)) {
                    s += next + "<br>";
                }
            }
            f.Close();
        document.getElementById("rg").innerHTML = "Отбор по регулярному выраению: <font color= red>" + reg + "</font>";
        document.getElementById("rez").innerHTML = s;
                    
        }

Так получше цепляет.

А форму я быстренько накидал, только для наглядности, она не обязательно должна быть у вас такой.
По сути я хотел показать лишь регулярки.

Нас невозможно сбить с пути, нам пофигу куда идти.

12

Re: JScript: переменные в регвыр

DnsIs пишет:

... метод регсэпов test глючит. Подробностей не знаю правда...

По конкретным найденным глюкам в JScript - вот код, их демонстрирующий.

WScript.Echo("ScriptEngine " + ScriptEngine() + " version " +
             ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion() + " build " + ScriptEngineBuildVersion());
var s = "abc DEF";
var re = /abc DEF/g; //ну проще некуда просто

WScript.Echo("re.test(s)=");
for ( var i = 0; i < 10; i++)
{
  WScript.Echo(i + ") test(s)=" + re.test(s));
}
WScript.Echo("\nre.exec(s)=");
for ( var i = 0; i < 10; i++)
{
  WScript.Echo(i + ") =" + re.exec(s));
}

выдает результаты:

ScriptEngine JScript version 5.8 build 22960
re.test(s)=
0) test(s)=true
1) test(s)=false
2) test(s)=true
3) test(s)=false
4) test(s)=true
5) test(s)=false
6) test(s)=true
7) test(s)=false
8) test(s)=true
9) test(s)=false

re.exec(s)=
0) =abc DEF
1) =null
2) =abc DEF
3) =null
4) =abc DEF
5) =null
6) =abc DEF
7) =null
8) =abc DEF
9) =null

Т. е. после верного ответа следующее обращение выдает неверный/пустой результат.
При этом нет гарантии, что это всегда работает "через раз". Если не ошибаюсь, то при использовании регэкспов определенной сложности ошибка может выскакивать с другой очередностью. Пример привести не могу - потерялся, впрочем помню, что это была в общем-то незамысловатая последовательность "(blabla\s)(blabla\d\d) ... и т.д. еще блоков 5-6", безо всяких просмотров вперед-назад и вложенностей.
А впрочем, стоит ли тратить время на изучение частоты встречаемости ошибки? Наверное достаточно просто знать ненадежные функции и не пользоваться ими.

Ошибка возникает только если применять переключатель регэкспа "g" (global, что означает, напомню, "искать все вхождения, а не останавливаться на первом найденном"). Это довольно важный переключатель, чтобы обходиться без него.
Затрагиваются функции re.test() и re.exec().

Данный глюк замечен только под ОС JScript WSH. Под VBS его нет, под IIS не проверял.

Я планировал представить сводные результаты тестирования регулярок на нескольких движках, включая IE/Win WSH vbs/jsc, javascript в разных браузерах, да еще для нескольких интерпретируемых языков аналогичные результаты посмотреть. При этом протестировать на глючность как можно более широкое множество спецсимволов и переключателей. Задачка оказалась немаленькая, пока еще не до всего руки дошли...

13

Re: JScript: переменные в регвыр

jite. Это ни в коем случае не ошибка.

re.test(s) аналогичен вызову re.exec(s) != null. То есть, для первой функции возврат значения true говорит об успешности поиска, иначе - false. Включение флага глобального поиска /g позволяет производить поиск многократно! Попробуйте для строки var s = 'abc DEF abc DEF'; и Вы увидите, что значение false повторяется уже через 2 раза.

Это очень удобно - многократно выполнить поиск по шаблону в строке.

var re = /\d+/g;
var s = '123 abc 456 def 789 xyz';
var result;

while ( result = re.exec(s) ) {
    alert(result[0]);
}
( 2 * b ) || ! ( 2 * b )

14

Re: JScript: переменные в регвыр

Rumata

Действительно, стоит заменить строку s на "abc DEF abc DEF abc DEF", как становится очевидна взаимосвязь test() и exec().
У меня регэксп с флагом global применительно к test() появлялся только в случаях его повторного использования, например, вместе с re.replace(). Т.к. для собственно test() флаг использовать бессмысленно... а вот, как оказалось, и нет. Не ожидал.

В документации по test() нет информации о связи ее с exec() , зато в exec(), как сейчас посмотрел, схема "while (result = re.exec(s)) ..." с флагом global описана вполне ясно.
Итого:

WScript.Echo("ScriptEngine " + ScriptEngine() + " version " + ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion() + " build " + ScriptEngineBuildVersion());
var s = "abc DEF abc DEF abc DEF";
var re = /abc DEF/g;
WScript.Echo("initial lastIndex=" + re.lastIndex);
WScript.Echo("re.test(s)=");
for ( var i = 0; i < 10; i++)
{
  WScript.Echo(i + ") test(s)=" + re.test(s) + "\t lastIndex=" + re.lastIndex);
}
WScript.Echo("\nre.exec(s)=");
for ( var i = 0; i < 10; i++)
{
  WScript.Echo(i + ") =" + re.exec(s) + "\t lastIndex=" + re.lastIndex);
}

Нету глюков в test() и exec() - то фичи, правда, не совсем очевидные.

15 (изменено: stir, 2011-02-07 06:20:51)

Re: JScript: переменные в регвыр

Я неиспользовал WScript, но при тестах поискового модуля на ПК клиента отмечаю, что функция с test работает заметно медленнее, чем match (365 строк в файле).
Регвыр. пришлось изменить для достижения своей цели, изменил первичную логику поиска - применил 3-хэтапный поиск (сначала по а11 без учета а22 и а33, потом из уже выделенных строк выбрал по а22, далее аналогично по а33 - все прошло успешно, никаких лишних элементов).

Любители построили Ковчег, а профессионалы - Титаник.

16

Re: JScript: переменные в регвыр

А зачем 3-х этапный то?

Нас невозможно сбить с пути, нам пофигу куда идти.

17

Re: JScript: переменные в регвыр

Так лучше получается, , все методом проб и ошибок... т.к. получилось как логика ИЛИ, а надо - И, вот и подкорректировал, как мне надо.

Любители построили Ковчег, а профессионалы - Титаник.

18 (изменено: stir, 2012-05-16 12:31:25)

Re: JScript: переменные в регвыр

.

Любители построили Ковчег, а профессионалы - Титаник.

19 (изменено: stir, 2012-05-16 12:30:18)

Re: JScript: переменные в регвыр

0

Любители построили Ковчег, а профессионалы - Титаник.

20

Re: JScript: переменные в регвыр

Доброго времени суток
Помогите пож. оптимизировать рег.выражение.


function alert(M) {WScript.Echo(M);}
var url='https://user:password@domain.com.ru:8080/some/path/index.html.txt?p=1&q=2&r=3&r=4#some-hash'
var url='//?/c:/Addons/Path/Mylib/01/01/000.txt.js';
var p = /(?:(.*)\:\/\/)?(?:(?:(.*?)(?:\:(.*))?\@)?(.[^\d]*(?=\.))?(.*?)?(?:\:(\d+))?(?:(?=\/)))?(?:\/\/\?\/(\w)\:)?(?:(\/.*)\/)?([^\#\?].*(?=\.))?([^\?\#]+)?(\?.[^\#]*)?(\#.[^\?]*)?/
var parts =eval(p).exec(url);
alert("Полный URL       :"+parts[0])  //
alert("Протокол         :"+parts[1])  // group 1:  (.*)             
alert("Пользователь     :"+parts[2])  // group 2:  (.*?)            
alert("Пароль           :"+parts[3])  // group 3:  (.*)             
alert("Домен            :"+parts[4])  // group 4:  (.[^\d]*(?=\.))  
alert("Хост или зона    :"+parts[5])  // group 5:  (.*?)            
alert("Порт             :"+parts[6])  // group 6:  (\d+)            
alert("Локальный диск   :"+parts[7])  // group 7:  (\w)             
alert("Путь к файлу     :"+parts[8])  // group 8:  (\/.*)           
alert("Имя файла        :"+parts[9])  // group 9:  ([^\#\?].*(?=\.))
alert("Расширение файла :"+parts[10]) // group 10: ([^\?\#]+)      
alert("Параметры        :"+parts[11]) // group 11: (\?.[^\#]*)     
alert("Якорь            :"+parts[12]) // group 12: (\#.[^\?]*)     
alert("Длинна массива   :"+(parts.length-1))// Размер массива

С наилучшими пожеланиями
XGuest