Сопоставление нескольких шаблонов с использованием Java Regex - PullRequest
5 голосов
/ 11 мая 2011

У меня есть файл, содержащий записи следующего формата:

1285957838.880      1 192.168.10.228 TCP_HIT/200 1434 GET http://www.google.com/tools/dlpage/res/c/css/dlpage.css [02/Oct/2010:00:00:38 +0530] je02121 NONE/- text/css

Имеет 11 полей ([02/Oct/2010:00:00:38 +0530] это одно поле)

Я хочу написать поля извлечения, скажем, 7, 8, 9. Можно ли извлечь эти поля, используя регулярное выражение Java.

Можно ли использовать регулярное выражение для сопоставления нескольких шаблонов для вышеуказанного?

Из приведенной выше записи мне нужно извлечь поля

f1: http://www.google.com/tools/dlpage/res/c/css/dlpage.css  
f2: 02/Oct/2010:00:00:38 +0530  
f3: je02121

Ответы [ 4 ]

14 голосов
/ 11 мая 2011

Делайте это последовательно, не все в одном шаблоне (если у вас много таких строк, сначала разбейте строки, а также извлеките скомпилированный шаблон в константу):

String input = "1285957838.880      1 192.168.10.228 TCP_HIT/200 1434 GET http://www.google.com/tools/dlpage/res/c/css/dlpage.css [02/Oct/2010:00:00:38 +0530] je02121 NONE/- text/css";
Matcher matcher = Pattern.compile("\\[.*?\\]|\\S+").matcher(input);
int nr = 0;
while (matcher.find()) {
    System.out.println("Match no. " + ++nr + ": '" + matcher.group() + "'");
}

Выход:

Match no. 1: '1285957838.880'
Match no. 2: '1'
Match no. 3: '192.168.10.228'
Match no. 4: 'TCP_HIT/200'
Match no. 5: '1434'
Match no. 6: 'GET'
Match no. 7: 'http://www.google.com/tools/dlpage/res/c/css/dlpage.css'
Match no. 8: '[02/Oct/2010:00:00:38 +0530]'
Match no. 9: 'je02121'
Match no. 10: 'NONE/-'
Match no. 11: 'text/css'

Шаблон регулярного выражения объяснил:

\\[    match an opening square brace
.*?    and anything up to a
\\]    closing square brace
|      or
\\S+   any sequence of multiple non-whitespace characters
5 голосов
/ 11 мая 2011

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

Pattern regex = Pattern.compile(
    "^(?:\\S+\\s+){6}   # first 6 fields\n" +
    "(\\S+)\\s+         # field 7\n" +
    "\\[([^]]+)\\]\\s+  # field 8\n" +
    "(\\S+)             # field 9", 
    Pattern.MULTILINE | Pattern.COMMENTS);
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    for (int i = 1; i <= regexMatcher.groupCount(); i++) {
        // matched text: regexMatcher.group(i)
        // match start: regexMatcher.start(i)
        // match end: regexMatcher.end(i)
    }
} 
1 голос
/ 11 мая 2011

использовать разделение с регулярным выражением "[\ t \ s] +?"и сохраните результаты в массиве скажем s.

Тогда ожидаемый результат будет s [6], s [7] + s [8] и s [9]

0 голосов
/ 15 декабря 2011

Эта опция не включает открывающие и закрывающие скобки ([]) в выводе

    String input = "1285957838.880      1 192.168.10.228 TCP_HIT/200 1434 GET http://www.google.com/tools/dlpage/res/c/css/dlpage.css [02/Oct/2010:00:00:38 +0530] je02121 NONE/- text/css";
    Matcher matcher = Pattern.compile("(\\d+/+\\w+/+\\d.* \\+\\d+)|([^\\[]\\S+[^\\]])").matcher(input);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...