0

奇数の金額を含む文字列があります。文字列は次のとおりです。

Daily interest charges #901 $ 17.2789 259.18 190.07/day

奇数値は$ 17.2789

is を取得する正規表現を作成しようとしていますが、後方参照はありません。これは私が思いついたものです:

(?:\\$\\s*?\\d{0,1,2,3}\\.\\d{0,1,2,3,4}\\s*?/?day)?

ただし、これはコンパイルされません。そこにあるものはすべて私には合理的に見えますか?何が問題なのですか?Javaを使用しています

編集

の m.buettner の提案を試しまし\\$\\s*\\d*\\.\\d*た。以下の 3 番目のグループに配置します。これでほとんどできます。これが私の完全な正規表現です:

(.*)\s?#(\s?\d{3,4})\s*(?:\$\s*\d*\.\d*)?((?:-|\()?\$?(?:\d{1,3}[ ,]?)*(?:\.\d+)\)?)\s*((?:-|\()?\$?(?:\d{1,3}[ ,]?)*(?:\.\d+)\)?).*

プルするグループは次のとおりです。

  1. 日割り金利
  2. 901
  3. 9 259.18
  4. 190.07

問題となるのはグループ化 3 です。最初の 1 桁が余分に含まれています。9

編集 編集

問題を引き起こしているスペースがありましたが、これで解決しました:

(?:\$\s*\d*\.\d*\s)?

4

2 に答える 2

3

私の知る限り、\\d{0,1,2,3...}有効な構文ではありません。あなたが意味したのはおそらく次のとおりです。

(?:\\$\\s*?\\d{0,3}\\.\\d{0,4}\\s*?/?day)?

また、パターン全体がオプションであることを認識していますか? これは問題を引き起こします。\\d{0,3}\\.\\d{0,4}最初の (奇数) 番号のみに一致します。次に、オプションのスラッシュがありますが、必須dayです (パターン全体が削除されない場合)。しかし、入力文字列には、/day遭遇する前にいくつかの他の数字があります。したがって、コンパイルしても、価格の値と一致しません。おそらく\\s*?/?day完全に除外する必要があります。また、外側?の も削除することを検討してください。\\sブライアンがコメントで述べたように、それと次の要素はとにかく相互に排他的であるため、繰り返しを貪欲にする必要はありません。

\\$\\s*\\d{0,3}\\.\\d{0,4}

とにかく値が「奇数」の場合、桁数について本当に具体的にする必要がありますか?

\\$\\s*\\d*\\.\\d*
于 2012-11-29T20:44:30.957 に答える
1

このパターン

"\\d+\\.\\d{3,}"

は、ドットの後に 2 桁を超えるすべての数字に一致します。

于 2012-11-29T21:03:27.633 に答える