私は、指定されたテキスト行の価格情報を抽出する必要があります。これまでのところ私は正規表現以下で成功した(\\d{1,3}(,\\d{3})*(\\.\\d+)?)
ような行をJavaでprice will be 90,500 USD
しかし、今、私はまた、価格の開始前に別の番号を持つラインを持っています(eg: for order number 12345 the price will be 100,500 USD)
。この場合、私の価格抽出は失敗します。例えば、上記の私を与える123
結果として。
私は正規表現を持つことができます/のみ価格情報を抽出するための別の方法にかかわらず、別の番号が存在するかどうか?(価格は常に千小数点ポイントの有無にかかわらず分離されます)
以下、私がこの仕事のために、今使っている完全なコードは次のとおりです。
private String getPrice(String fileText) {
String lines[] = fileText.split(System.lineSeparator());
for (String line : lines) {
Pattern p = Pattern.compile("(\\d{1,3}(,\\d{3})*(\\.\\d+))");
Matcher m = p.matcher(line);
if (m.find()) {
return m.group(0);
}
p = Pattern.compile("(\\d{1,3}(,\\d{3})*(\\.\\d+)?)");
m = p.matcher(line);
if (m.find()) {
return m.group(0);
}
}
return "";
}
私は試合が単語レベルであることを期待しています。(eg: 123 of 12345 should not match.)
マイ単語の区切りがあるspace
のみ。123-456
単一の単語と考えられています。だから、外の123456
、123-456
、123,456
、123,456.56
、A123456
のみ123,456
、123,456.56
一致している必要があります。問題は、私の現在のコードの抽出物で123
の123456
、123-456
およびA123456
あなたの正規表現は、任意のコンテキストで番号と一致し、小数部分が義務付けられています。
私は提案します:
- それは単語の文字で囲まれていない場合にのみ、番号をマッチング
- fracion数部パターンの周囲に任意の非キャプチャグループを使用して。
使用する
Pattern p = Pattern.compile("\\b\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)?\\b");
参照してください。正規表現のデモを。
\b
パターンは、ワード境界であり、(?:...)?
中に(?:\\.\\d+)?
1または0回繰り返される非キャプチャグループである、つまりはオプションです。