2013-02-26 4 views
0

У меня есть необработанный ответ HTTP, как показано ниже:Regex: Извлечение строки из трубы sperated файла

1 
1|CI17438666|IB136180000001|55544001|10.106.1.XXX| 
|first   

Мне нужно извлечь 44001 часть из него.

Я могу однозначно идентифицировать эту строку, используя Start: | 555 Конец: |

Я попытался

(.*)(|555)(.*)(|) 

который возвращает 1.

На стороне записки, я использую это регулярное выражение в Jmeter, который следует ява скрипт в стиле регулярных выражений.

ответ

1

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

Во-первых, что символ трубы имеет особое значение в регулярном выражении, это означает ИЛИ. Например, это регулярное выражение:

[abc|def] 

Будет соответствовать «abc» или «def».

Это означает, что ваши секции регулярного выражения '(| 555)' и '(|)' означают «ничего ИЛИ 555» для первого случая и «ничего или ничего» для второго случая.

Если вы хотите совместить символ трубы, вам нужно сбежать от него, поэтому '|' становится '\ |'.

Вторая проблема заключается в том, что. * Является жадным совпадением, он будет соответствовать как можно больше, и поскольку ваша точка представляет любого персонажа, вы получите соответствие прямо до следующей сопоставимой группы.

Так что, если мы фиксируем проблему трубы и получить это новое регулярное выражение:.

.*\|555(.*)\| 

Использование пример строки, то * совпадений:

1|CI17438666|IB136180000001|55544001|10.106.1.XXX| 
           ^^^^^^^^^^^^^^^^^^ 

Другими словами, он соответствует столько, сколько он может до следующей группы.

Вы можете переключиться с жадных на ленивых, добавив дополнительно? в конце, поэтому '. *' становится '. *?"Это остановит соответствие как только совпадение, ваше регулярное выражение теперь:

.*\|555(.*?)\| 

И Ваша соответствующая группа теперь становится:

1|CI17438666|IB136180000001|55544001|10.106.1.XXX| 
           ^^^^^ 

Если вы знаете, что символы следующие 555 всегда будет числовые цифры, то вы можете ограничить соответствующую группу только цифры, а не беспокоиться о жадной и ленивой:

.*\|555([0-9]*)\| 

Надежде, что помогает.

+0

Я выбираю ваш ответ как правильный ответ для подробного объяснения. Спасибо! – user1263746

3

Если это шаблон, это будет работать:

\|555(\d+)\| 

Это соответствует части после 555 и между двумя трубами.

+0

Отлично работает. Спасибо. – user1263746

1

Попробуйте это:

$str = '11|CI17438666|IB136180000001|55544001|10.106.1.XXX||first '; 
preg_match('/\|555(?P<digits>\d+)\|/',$str,$match); 

echo $match['digits']; 

ИЛИ

$str = '11|CI17438666|IB136180000001|55544001|10.106.1.XXX||first '; 
preg_match('/\|555(\d+)+\|/',$str,$match); 

echo "<pre>"; 
print_r($match); 
+0

Ваша часть регулярного выражения идеальна. Но регулярное выражение входит в jmeter, который не может обрабатывать PHP-код. Благодаря! – user1263746

0
var str = "11|CI17438666|IB136180000001|55544001|10.106.1.XXX||first"; 
var pattern = "(.*)(/|555)([0-9]*)(/|)"; 
var result = str.match(pattern); 
// The matches are in elements 0 through n. 
for (var index = 0; index < result.length; index++) 
{ 
    document.write ("submatch " + index + ": " + result[index]); 
    document.write("<br />"); 
} 

Третья строка возвращает возвращаемый результат.

Смежные вопросы