Соответствует регулярному выражению справа налево? - PullRequest
13 голосов
/ 07 июня 2010

Есть ли способ сопоставить регулярное выражение справа налево? То, что я ищу, это регулярное выражение, которое получает

MODULE WAS INSERTED              EVENT
LOST SIGNAL ON E1/T1 LINK        OFF
CRC ERROR                        EVENT
CLK IS DIFF FROM MASTER CLK SRC  OF

с этого входа

CLI MUX trap received: (022) CL-B  MCL-2ETH             MODULE WAS INSERTED              EVENT   07-05-2010 12:08:40
CLI MUX trap received: (090) IO-2  ML-1E1        EX1    LOST SIGNAL ON E1/T1 LINK        OFF     04-06-2010 09:58:58
CLI MUX trap received: (094) IO-2  ML-1E1        EX1    CRC ERROR                        EVENT   04-06-2010 09:58:59
CLI MUX trap received: (009)                            CLK IS DIFF FROM MASTER CLK SRC  OFF     07-05-2010 12:07:32

Если бы я мог сделать сопоставление справа налево, я мог бы написать что-то вроде всего справа (EVENT | OFF) до второго появления более чем одного пробела [] +

Лучшее, что мне удалось сегодня, - это получить все от (022) до СОБЫТИЯ с помощью регулярного выражения

CLI MUX trap received: \([0-9]+\)[ ]+(.*[  ]+(EVENT|OFF))

Но это не совсем то, что я хотел:)

edit: На каком языке это? На самом деле это строка конфигурации для фильтра, который у нас есть, но я предполагаю, что она использует стандартную библиотеку GNU C Regex.

edit2: Мне нравятся ответы о сокращении по длине, но, вероятно, Amarghosh был больше, чем я искал. Не знаю, почему я не думал о том, чтобы просто отрезать по длине, как:

^.{56}(.{39}).*$

Супер спасибо за быстрые ответы ...

Ответы [ 6 ]

19 голосов
/ 07 июня 2010

В .NET вы можете использовать опцию RightToLeft :

Regex RE = new Regex(Pattern, RegexOptions.RightToLeft);
Match theMatch = RE.Match(Source);
3 голосов
/ 07 июня 2010

С помощью регулярного выражения вы можете просто заменить это:

^.{56}|.{19}$

с пустой строкой.

Но на самом деле вам нужно всего лишь вырезать строку из «позиции 56» в «длину строки - 19» с помощью функции подстроки. Это проще и намного быстрее, чем регулярное выражение.

Вот пример в JavaScript, другие языки работают примерно так же:

var lines = [
  'CLI MUX trap received: (022) CL-B  MCL-2ETH             MODULE WAS INSERTED              EVENT   07-05-2010 12:08:40',
  'CLI MUX trap received: (090) IO-2  ML-1E1        EX1    LOST SIGNAL ON E1/T1 LINK        OFF     04-06-2010 09:58:58',
  'CLI MUX trap received: (094) IO-2  ML-1E1        EX1    CRC ERROR                        EVENT   04-06-2010 09:58:59',
  'CLI MUX trap received: (009)                            CLK IS DIFF FROM MASTER CLK SRC  OFF     07-05-2010 12:07:32'
];
for (var i=0; i<lines.length; i++) {
  alert( lines[i].substring(56, lines[i].length-19) );
}
2 голосов
/ 07 июня 2010

Если токены гарантированно разделены более чем одним пробелом, а слова в строке до EVENT|OFF гарантированно разделены только одним пробелом - только тогда вы можете искать слова, разделенные одним пробелом, за которыми следуют пробелыEVENT или OFF

var s = "CLI MUX trap received: (022) CL-B  MCL-2ETH             MODULE WAS INSERTED              EVENT   07-05-2010 12:08:40"
        + "\nCLI MUX trap received: (090) IO-2  ML-1E1        EX1    LOST SIGNAL ON E1/T1 LINK        OFF     04-06-2010 09:58:58"
        + "\nCLI MUX trap received: (094) IO-2  ML-1E1        EX1    CRC ERROR                        EVENT   04-06-2010 09:58:59"
        + "\nCLI MUX trap received: (009)                            CLK IS DIFF FROM MASTER CLK SRC  OFF     07-05-2010 12:07:32"

var r = /\([0-9]+\).+?((?:[^ ]+ )* +(?:EVENT|OFF))/g;
var m;
while((m = r.exec(s)) != null)
  console.log(m[1]);

Вывод:

MODULE WAS INSERTED              EVENT
LOST SIGNAL ON E1/T1 LINK        OFF
CRC ERROR                        EVENT
CLK IS DIFF FROM MASTER CLK SRC  OFF

Регулярное выражение: /\([0-9]+\).+?((?:[^ ]+ )* +(?:EVENT|OFF))/g

\([0-9]+\)       #digits in parentheses followed by  
.+?              #some characters - minimum required (non-greedy)  
(                #start capturing 
(?:[^ ]+ )*      #non-space characters separated by a space  
` +`             #more spaces (separating string and event/off - 
                 #backticks added for emphasis), followed by
(?:EVENT|OFF)    #EVENT or OFF
)                #stop capturing
1 голос
/ 07 июня 2010

Хорошо ли вписывается входной файл в табличный текст фиксированной ширины? Потому что, если это так, то самое простое решение - просто взять правильные substring каждой строки, от столбца 56 до столбца 94.

В Unix вы можете использовать команду cut:

cut -c56-94 yourfile

Смотри также


В Java вы можете написать что-то вроде этого:

String[] lines = {
    "CLI MUX trap received: (022) CL-B  MCL-2ETH             MODULE WAS INSERTED              EVENT   07-05-2010 12:08:40",
    "CLI MUX trap received: (090) IO-2  ML-1E1        EX1    LOST SIGNAL ON E1/T1 LINK        OFF     04-06-2010 09:58:58",
    "CLI MUX trap received: (094) IO-2  ML-1E1        EX1    CRC ERROR                        EVENT   04-06-2010 09:58:59",
    "CLI MUX trap received: (009)                            CLK IS DIFF FROM MASTER CLK SRC  OFF     07-05-2010 12:07:32",
};
for (String line : lines) {
    System.out.println(line.substring(56, 94));
}

Это печатает:

MODULE WAS INSERTED              EVENT
LOST SIGNAL ON E1/T1 LINK        OFF  
CRC ERROR                        EVENT
CLK IS DIFF FROM MASTER CLK SRC  OFF  

Регулярное решение

Скорее всего, в этом нет необходимости, но что-то вроде этого работает ( как видно на ideone.com ):

line.replaceAll(".*  \\b(.+  .+)   \\S+ \\S+", "$1")

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

По сути, вы сопоставляете это с каждой строкой:

.*  \b(.+  .+)   \S+ \S+

И вы заменяете его на любую группу 1. Это зависит от использования двух последовательных пробелов исключительно для разделения столбцов в этой таблице.

0 голосов
/ 07 июня 2010

Можете ли вы выполнять ориентированную на поле обработку вместо регулярных выражений?В awk / sh это будет выглядеть следующим образом:

< $datafile awk '{ print $(NF-3), $(NF-2) }' | column

, что выглядит чище, чем указание регулярного выражения.

0 голосов
/ 07 июня 2010

Как насчет

.{56}(.*(EVENT|OFF))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...