1

Тема: jscript:Почему не работает регулярное выражение?

Есть строка: "  TCP    192.168.1.1:1063     192.168.2.2:1521     ESTABLISHED"
есть регулярное выражение: "(\s)*TCP(\s*)(\d+\.)*\d+:\d+(\s+)(\d+\.)*\d+:\d+(\s+)(\w+)"
но почему то

re.exec(str)

не дает ни одного совпадения, имею ввиду:

WScript.Echo(RegExp.$1);
WScript.Echo(RegExp.$2);

и т.д. выдают null
Можете подсказать где ошибся?

2

Re: jscript:Почему не работает регулярное выражение?

Все работает. Только в регулярном выражении содержится бесполезная информация:

RegExp.$1 == ' '
RegExp.$2 == '    '
RegExp.$3 == '1.'
и т.д.

И регулярное выражение надо правильно инициализировать. Почувствуйте разницу:


re = /(\s)*TCP(\s*)(\d+\.)*\d+:\d+(\s+)(\d+\.)*\d+:\d+(\s+)(\w+)/;

re = new RegExp('(\\s)*TCP(\\s*)(\\d+\\.)*\\d+:\\d+(\\s+)(\\d+\\.)*\\d+:\\d+(\\s+)(\\w+)');
( 2 * b ) || ! ( 2 * b )

3

Re: jscript:Почему не работает регулярное выражение?

Rumata пишет:

Все работает. Только в регулярном выражении содержится бесполезная информация:

RegExp.$1 == ' '
RegExp.$2 == '    '
RegExp.$3 == '1.'
и т.д.

И регулярное выражение надо правильно инициализировать. Почувствуйте разницу:


re = /(\s)*TCP(\s*)(\d+\.)*\d+:\d+(\s+)(\d+\.)*\d+:\d+(\s+)(\w+)/;

re = new RegExp('(\\s)*TCP(\\s*)(\\d+\\.)*\\d+:\\d+(\\s+)(\\d+\\.)*\\d+:\\d+(\\s+)(\\w+)');

Как получить именно 192.168.2.2?
Попробовал

re = new RegExp('(\\s)*TCP(\\s*)(\\d+\\.)*\\d+:\\d+(\\s+)(\\d+\\.)*\\d+:\\d+(\\s+)(\\w+)');

Проверил значения $1..$9 одни сполшные null вместо 192.168.2.2

4

Re: jscript:Почему не работает регулярное выражение?

Нужно получить из строчек вида "  TCP    192.168.1.1:1000      192.168.1.2:2000              LISTENING" ip адрес, в данном случае 192.168.1.2
У меня это значение не попадет ни в одну переменную от $1 до $9

var day = new Date();
var logdir = "d:\\userlist";
var line, str;

var netstat = WScript.CreateObject("WScript.Shell");
var dir = WScript.CreateObject("Scripting.FileSystemObject");
var file = WScript.CreateObject("Scripting.FileSystemObject");

function getFormatDate() {
    var date, ldate;

    date = day.getDate();
    if (date < 10) date = "0" + date;
    ldate = date + "_";
    date = day.getMonth();
    if (date < 10) date = "0" + date;
    ldate += date + "_";
    date = day.getYear();
    if (date < 10) date = "0" + date;
    ldate += date + "_";
    date = day.getHours();
    if (date < 10) date = "0" + date;
    ldate += date + "_";
    date = day.getMinutes();
    if (date < 10) date = "0" + date;
    ldate += date;

    return ldate;
}



if (!dir.folderExists(logdir)) dir.createFolder(logdir);

var today = getFormatDate();

netstat.run("%COMSPEC% /q/c netstat.exe -an >" + logdir + "\\" + today + ".tmp",0,true);

// Обрабатываем полученый лог
var userlisttmp = file.OpenTextFile(logdir + "\\"+today + ".tmp",1);
var userlist = file.OpenTextFile(logdir + "\\"+today,2,true);

var re = new RegExp('(\\s)*TCP(\\s*)(\\d+\\.)*\\d+:\\d+(\\s+)(\\d+\\.)*\\d+:\\d+(\\s+)(\\w+)');

while (!userlisttmp.atEndOfStream) {
    line = userlisttmp.readLine();
    if ((str = line.match("TCP","ig")) && (str = line.match("192.168.1","ig"))) 
    {
        if (re.exec(str)) userlist.writeLine("OK");
        else userlist.writeLine(RegExp.input + " ->BAD");
    }
}

userlisttmp.close();
userlist.close();

file.deleteFile(logdir + "\\" + today + ".tmp");

5

Re: jscript:Почему не работает регулярное выражение?

... одни сполшные null...

Нет там null.

Чтобы найти IP пишите ((?:\d+\.){3}\d+). Используйте круглые скобки по назначению -- для запоминания вхождения в строку. Не заключайте ненужные элементы в круглые скобки если они (элементы) Вам не нужны в дальнейшем.

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

6

Re: jscript:Почему не работает регулярное выражение?

Rumata пишет:

... одни сполшные null...

Нет там null.

Чтобы найти IP пишите ((?:\d+\.){3}\d+). Используйте круглые скобки по назначению -- для запоминания вхождения в строку. Не заключайте ненужные элементы в круглые скобки если они (элементы) Вам не нужны в дальнейшем.

var re = new RegExp(((?:\d+\.){3}\d+));

На это выдает "Синтаксическая ошибка"

7 (изменено: Spy00000, 2011-07-07 16:53:05)

Re: jscript:Почему не работает регулярное выражение?

worsvch
как Вам написал Rumata, для написания регулярных выражений лучше использовать конструкцию / ... / , а не new RegExp( ... ) - запись короче, слеши не надо дублировать. Вариант Вашего рег. выражения - во второй строчке. После его применения в RegExp.$1 - протокол, в RegExp.$2 и RegExp.$3 - IP-адреса, в RegExp.$4 - статус соединения.

//var re = new RegExp('(\\s)*TCP(\\s*)(\\d+\\.)*\\d+:\\d+(\\s+)(\\d+\\.)*\\d+:\\d+(\\s+)(\\w+)');
var re= /\s*(\S+)\s+((?:\d+\.){3}\d+):\d+\s+((?:\d+\.){3}\d+):\d+\s+(\S+)/;

var Protocol , IP1 , IP2 , State;

while (!userlisttmp.atEndOfStream) {
    line = userlisttmp.readLine();
    if( line.match( re )){
      Protocol = RegExp.$1;
      IP1 = RegExp.$2;
      IP2 = RegExp.$3;
      State = RegExp.$4;
      if( (Protocol == 'TCP') && (IP1.substr( 0, 9) == '192.168.1')){
        // тут что-то, к примеру:
        userlist.writeLine( IP1 + ' -> ' + IP2 );
      }else{
        // тут что-то другое
      }
    }else{
        // тут что-то для случая, если строка не соответствует рег. выражению.
    }
/*
    if ((str = line.match("TCP","ig")) && (str = line.match("192.168.1","ig"))) 
    {
        if (re.exec(str)) userlist.writeLine("OK");
        else userlist.writeLine(RegExp.input + " ->BAD");
    }
//*/
}

По поводу Вашей функции getFormatDate():
1. .getMonth() - возвращает номер месяца, начиная с НУЛЯ, т.е. 0 - январь, 6 - июль. Имейте ввиду.
2. строчку     

var day = new Date();

лучше из начала скрипта переставить в начало функции getFormatDate(). Так будет быстрее работать и потом эту функцию будет проще переносить в другие скрипты (не надо будет искать - откуда берётся значение переменной day)

8

Re: jscript:Почему не работает регулярное выражение?

Всем большое спасибо, получилось наконец то
Один момент только непонятен в данном выражении ((?:\d+\.){3}\d+), что здесь означает "?:" ?

9

Re: jscript:Почему не работает регулярное выражение?

Здесь правильнее сказать - "что означает (?: ... )". Эта конструкция означает, что содержимое внутри скобок будет сгруппировано (т.е. будет рассматриваться как одно целое), но не будет запоминаться (в частности в объект RegExp). 
Вот здесь написано - какие конструкции можно использовать в регулярных выражениях и для чего: Regular Expression Syntax (Scripting)

10

Re: jscript:Почему не работает регулярное выражение?

Spy00000 пишет:

Здесь правильнее сказать - "что означает (?: ... )". Эта конструкция означает, что содержимое внутри скобок будет сгруппировано (т.е. будет рассматриваться как одно целое), но не будет запоминаться (в частности в объект RegExp). 
Вот здесь написано - какие конструкции можно использовать в регулярных выражениях и для чего: Regular Expression Syntax (Scripting)

Спасибо большое