2012-02-11 7 views
1

と私は、次の達成するためにかなり複雑な正規表現を必要とする:すべて一緒複雑な正規表現は、文字列から数字をフィルタリングするが、例外

> replace numbers in a string, i.e. 700, 12.43 by a label (format: {NUMBER:xx}) 
> ignore: when number is between {braces}, i.e. {7}, {7th} 
> ignore: when any character is attached to number, i.e. G3, 7x, 1/2 
> except: when 
      > preceded by $, i.e. $840 
      > followed by .!?:, i.e. 33! 45.65? 4... 

を撮影:

Buy 4 {5} G3 Mac computers for 80% at $600 or 2 for 1/2 price: 200... 
dollar. Twice - 2x - as cheap! 

所望の出力:

Buy {NUMBER:4} {5} G3 Mac computers for 80% at 
$ {NUMBER:600} or {NUMBER:2} for 1/2 price: 
{$NUMBER:200} dollar. Twice - 2x - as cheap! 

私は今これを持っています:

言い換えれば

Buy {NUMBER:4} {5} G {NUMBER:3} Mac computers for {NUMBER:80} % at 
$ {NUMBER:600} or {NUMBER:2} for {NUMBER:1}/{NUMBER:2} price: 
{NUMBER:200} ... dollar. Twice - {NUMBER:2} x - as cheap! 

:出力3210

preg_replace("/(?<!{)(?>[0-9]+(?:\.[0-9]+)?)(?!})/", " {NUMBER:$0} ", $string); 

無視して、例外がまだ機能していない、と私はそれを正しく実装する方法がわかりません。誰が私を助けてくれますか?

答えて

2

これは、テストケースのために働くと自分のルールに従って、中括弧が正しく一致してネスト解除されていると仮定:

$result = preg_replace(
    '/(?<!\{)  # Assert no preceding { 
    (?<![^\s$])  # Assert no preceding non-whitespace except $ 
    \b    # Match start of number 
    (\d+(?:\.\d+)?+) # Match number (optional decimal part) 
    \b    # Match end of number 
    (?![^{}]*\})  # Assert that next brace is not a closing brace 
    (?![^\s.!?,]) # Assert no following non-whitespace except .!?, 
    /x', 
    '{NUMBER:\1}', $string); 
+0

作品GRET、説明のためにありがとう! – Pr0no

+0

@Reveller - 小規模な修正を追加しました:オプションの小数部の一致を所有していました( '(...)?+')か、正規表現は '1.5x'の'あなたが望んでいた、またはあなたは? –

+0

ティム、あなたは正しいです:)それは私が望んでいなかったでしょう。ありがとう! – Pr0no

1
$string="Buy 4 {5} G3 Mac computers for 80% at \$600 or 2 for 1/2 price: 200... \ndollar. Twice - 2x - as cheap!"; 
$pattern='/[\s|^|\$]([0-9]+(\.\s+)*)[\s|$|\.|\!|\?|\:|\,]/'; 
//$count=preg_match_all($pattern, $string, $matches); 
//echo "$count\n"; 
//print_r($matches[1]); 
echo preg_replace($pattern,"{NUMBER:\$1}",$string); 
+0

「/[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\小数点をも捕まえる。 – iDifferent

関連する問題