2013-07-24 2 views
1

У меня есть строка:Регулярное выражение для сравнения цифры предшествуют точкой

Product, Q.ty: 1, Price: 120.00 

Я хочу, чтобы выбрать все после первой запятой до последних двух десятичных цифр (.00) - или, другими словами, , выберите Product, который будет переменным, хотя; то, что не является переменной, является , Q.t, и также известно, что последние два символа в строке будут содержать две цифры, которым предшествует точка .. Однако только последний будет всегда 0, предшествующий ему может быть что угодно 0-9, но всегда цифра.

Я использовал это, чтобы соответствовать строке:

preg_replace('/' . preg_quote(', Q.t') . '.*?' . preg_quote('.00') . '/', '', $data); 

проблема заключается в том, что он терпит неудачу, когда две последние цифры не 00, но что-то еще, как 50, 40, 30 и т.д. Если я использую одно и то же регулярное выражение с одной цифрой '0', оно не будет работать либо потому, что оно поймает первое 0 в строке, как в моем предыдущем примере, и оставит остальное 0.

Как настроить это выражение, чтобы поймать группе цифр, которым предшествует «.». точка?

* еще одно примечание: это preg_replace находится внутри петли foreach; некоторые данные не будут совпадать со всем шаблоном, который я пытаюсь передать; это нормально, поэтому в таких случаях я могу печатать строки так, как они есть; но за исключением случаев, в Еогеаспе, где есть совпадение, я хочу, чтобы заменить часть строки ни с чем *

Спасибо

+1

В качестве небольшого намека вы можете использовать 'd' в регулярном выражении для соответствия цифре. – Tro

+0

Не могли бы вы показать другие строки примеров и сообщить нам, что еще статично, например ** Продукт, ** и ** Цена: ** Я предполагаю. – varubi

+0

«Продукт» изменяется; «, Q.t» останется там, последние два символа в строке всегда будут цифрами и впереди будет точка ». – unfulvio

ответ

2
/([^,]*), Q\.ty: (\d*), Price: (\d*\.\d{2})/ 

С помощью ([^,]*), он будет использовать запятую в строке в качестве первого разделителя. Это приведет к началу строки до первой запятой, второе совпадение будет количеством, а последним будет цена.

Так что ваша строка при условии:

Product, Q.ty: 1, Price: 120.00 

вернется

$1 = Product 
$2 = 1 
$3 = 120.00 

на стороне записки, я не знаю, если этот период после Q в Q.ty является преднамеренным в вашем примере, или просто опечатка.

+0

спасибо, на самом деле мне не нужны переменные; preg_replace в моем исходном вопросе используется в цикле foreach, и некоторые данные не совпадают вообще; Я ищу что-то, чтобы заменить содержимое preg_replace в моем примере, особенно для второго preg_quote() – unfulvio

+1

Вот ссылка, чтобы вы могли видеть этот шаблон в действии при замене preg. http://phpfiddle.org/lite/code/5tj-zx0 Эти переменные, перечисленные мной, на самом деле являются обратными ссылками для второго аргумента preg_replace. Который, на мой взгляд, немного чище, чем ваш оригинальный шаблон, и позволяет вам переформатировать строки, как вам хочется, с переменными деталями. Если вы твердо придерживаетесь своего выражения. Изменение ''. *? ' , preg_quote (». 00'). '/', ' - ' '. *? \. \ D0/',' – varubi

2

Почему просто не

/(\d+\.\d{2})$/ 

, который будет захватывать любой хвостовой «номер «с десятичной точкой?

+0

спасибо, мне нужно получить и все после первой запятой, а не только последнее число справа; по существу мне нужно сохранить только метку «Продукт», другими словами – unfulvio

1

Если вам нужна буквальная точка, вы должны ее просмотреть: \.

2

Вы можете попробовать

(.+?), (Q\.ty: \d+, .+?\.\d{2}) 

Это должно захватить все от первой запятой до последних двух десятичных цифр в $ 2, с этикеткой продукта держат в $ 1

+0

Вы используете внешний вид. Это фактически не «фиксирует» часть «Q \ .ty:». Он проверяет только его существование. –

+0

К сожалению, я думал, что OP хочет текст после запятой в Q.ty. Ответ отредактирован. –

+0

Это круто. Просто подумал, что я хотел бы указать на всех, кто не знаком с внешним видом. –

2

Я понял, кто-то (всегда есть) скажет: «Вы можете получить кусочки с str_replace() и explode()». Однако это не быстрее.

<?php 

$string = "Product, Q.ty: 1, Price: 120.00"; 
$removals = array(",",":"); 


$stime = microtime(); 
    $nstring = str_replace($removals,'',$string); 
    $parts = explode(" ",$nstring); 

echo microtime()-$stime."secs\n"; 
    print_r($parts); 

$pattern = "!^([A-Za-z]+),\s([A-Za-z.]+)\:\s([0-9]+),\s([A-Za-z]+):\s([0-9.]+)$!"; 

$ptime = microtime(); 
    $m = preg_match($pattern,$string,$matches); 
echo microtime()-$ptime."secs\n"; 

print_r($matches); 

?> 

Выход

4.0999999999958E-5secs 
Array 
(
    [0] => Product 
    [1] => Q.ty 
    [2] => 1 
    [3] => Price 
    [4] => 120.00 
) 
3.5000000000007E-5secs 
Array 
(
    [0] => Product, Q.ty: 1, Price: 120.00 
    [1] => Product 
    [2] => Q.ty 
    [3] => 1 
    [4] => Price 
    [5] => 120.00 
) 

Использование более буквального подхода, обеспечивая $string не отклоняется, не улучшает выполнение функции preg_match.

$pattern = "!^(Product), (Q\.ty): ([0-9]+), (Price): ([0-9.]+)$!"; 
Смежные вопросы