2017-01-23 4 views
5

数字のない数字に一致するプログラムを作成するタスクがあります。たとえば、次のようにRegex - その隣に文字がない数字のみを取り込みます。

6X^2 + 6X + 6-57 + 8-9-90x

私は+またはですべての番号をキャプチャするために正規表現を使用しようとしている - 彼らの前に - しかしなしその後x。私は試しました

\[+-](\d+)[^x] 

しかし、 '-90x'から '-90'もキャプチャしているようです。

+0

Regexは、検索されている文字列と文字パターンを一致させるためのテンプレートとして機能することがわかっています。これはブール関数であることを意味します。私はあなたが "キャプチャ"することを意味するか分からない。 – yazanpro

+0

私はそれがxのない番号を見つけることができるので、それらを置き換えることができます。 – Netheous

+0

「-90x」をキャプチャしますか?「90x」を「-90x」からキャプチャしますか?最初の場合は普通のように見えませんが、2番目の場合は最後の 'x'が最初のものではなく、 '6x'の後ろに他の記号があるので '^ x'と一致します。他の文字がないので、 '90x'に一致することはできません。私は '[^ x]'がここで間違っていると思う。 – Kaddath

答えて

8

正しい正規表現は、このようになります:

@"[+-]((?>\d+))(?!x)" 

代替非.NETソリューション:

[+-](\d++)(?!x) 

@" 
[+-]   // Prefix non captured 
(    // Begin capturing group 
    (?>   // Begin atomic (non-backtracking) group - this part is essential 
     \d+  // One or more digits 
    )   // End atomic group 
)    // End capturing group 
(?!    // Begin negative lookahead 
    x   // 'x' literal 
)    // End negative lookahead 
" 

あなたはhere

+1

あなたは神です。 – Netheous

+0

あなたが* why *を説明した場合、つまりOPが失敗した表現が間違っていたことを説明した方が、この回答は良いでしょう。 –

+0

それは素晴らしいです。私が探していた 'Atomic Group 'の+1。しかし、私は使用された正規表現の説明を追加します。 –

0

に主な問題は、それをテストすることができます元の正規表現はそれですがエスケープされ、リテラルが一致し、もう1つの問題は(\d+)[^x]で1+数字をキャプチャしてグループ1にキャプチャした後、[^x]x以外の任意の文字に一致します。つまり、-90xの場合、は-と一致し、(\d+)と一致して一致すると9[^x]が一致し、0と一致します。

より適切な正規表現は、負の先読みにx\dパターンを含むことがある:

[+-](\d+)(?![\dx]) 

regex demoを参照してください。

パターンは詳細:

  • [+-] - のいずれか+又は-
  • (\d+) - 1+桁もしマッチに失敗した負先読み - 1桁以上
  • (?![\dx])に一致するグループ1のキャプチャ数字またはxが続きます。
関連する問題