8

これは単純なもののように思えますが、何かが欠けています。

さまざまなソースからさまざまな形式で多数の入力があります。

数値入力

123
123.45
123,45 (note the comma used here to denote decimals)
1,234
1,234.56
12,345.67
12,345,67 (note the comma used here to denote decimals)

入力に関する追加情報

  • 数値は常に 100 万未満です
  • 編集: これらは価格であるため、整数全体または 100 分の 1 のいずれかになります

正規表現を作成し、gsub を使用して数千のコンマを削除しようとしています。どうすればいいですか?

私は正規表現を書きました:myregex = /\d+(,)\d{3}/

Rubular でテストすると、必要なテスト ケースでのみコンマがキャプチャされることがわかります。

しかし、gsub を実行すると、空の文字列が表示されます。inputstr.gsub(myregex,"")

() 内のコンマだけでなく、gsub がすべてをキャプチャしているようです。どこが間違っていますか?

4

3 に答える 3

9
result = inputstr.gsub(/,(?=\d{3}\b)/, '')

ちょうど 3 桁の数字が続く場合にのみコンマを削除します。

(?=...)先読みアサーションです。現在の位置で一致できる必要がありますが、実際に一致する (そしてその後置換される) テキストの一部にはなりません。

于 2013-01-30T21:22:38.023 に答える
1

「一致」と「キャプチャ」を混同しています。「キャプチャ」とは、後で参照できるように何かを保存することを意味します。コンマではなく他のすべてをキャプチャし、キャプチャした部分を使用して置換文字列を作成します。

試す

myregex = /(\d+),(\d{3})/

inputstr.gsub(myregex,'\1\2')
于 2013-01-30T21:24:56.457 に答える
0

あなたの例では、最後の区切り記号 (または) の後の桁数から、2桁しかないため、小数点であることがわかりますほとんどの場合、最後の数字グループが 3 桁でない場合、前の区切り文字は小数点であると想定できます。もう 1 つの兆候は、区切り記号が大きな数字に複数出現することで、小数点と区切り記号を区別できるようになることです。,.

ただし、文字列を指定する123,456こと123.456も、コンテキストを指定せずに指定することもできます。「123千456」なのか「123点456」なのか判別不能

,が千区切りまたは小数点に使用されているかどうかの手がかりを探すために、ドキュメントをスキャンする必要があります.。提供されたコンテキストを使用して、同じメソッドを安全に適用して千単位の区切り文字を削除できます。

区切り記号や小数点を指定するあまり一般的ではない方法については、ウィキペディアのこの記事も参照してください。サポートしないことを知って決定することは、物事がうまくいくと仮定するよりも優れています.

于 2013-01-30T21:41:37.643 に答える