0

次の文字列 (名前はinterim )から 2 つの数値を抽出しようとしています。

"location" : { "lat" : 42.3875968, "lng" : -71.0994968 },

C# で使用するコードは次のとおりです。

// define a regex for float numbers
Regex rx = new Regex(@"\b-?[0-9]*\.?[0-9]+\b", RegexOptions.Compiled | RegexOptions.IgnoreCase);
// Find matches.
MatchCollection matches = rx.Matches(interim);

return matches[0].ToString() + ", " + matches[1].ToString();

戻り値は"42.3875968, 71.0994968"で、2 番目の浮動小数点数のマイナス記号はありません。

「-」がマッチ変数の結果にないことを確認できるコードにデバッグしました。

同じ結果を得るために、次の正規表現もテストしました。

[-+]?[0-9]*\.?[0-9]+
(-|+)?[0-9]*\.?[0-9]+
(-|\+)?[0-9]*\.?[0-9]+
(-\+)?[0-9]*\.?[0-9]+

なぜこれがうまくいかないのか、誰にも分かりますか?

ありがとう、マイロ

4

3 に答える 3

2

あなたの問題は\b、式の最初と最後が本当に欲しいものではないということだと思います。それらを削除して@"-?[0-9]*\.?[0-9]+".

それらが行うことは、単語と非単語の文字の間に境界があることを確認することです。これは、ほとんどの場合、あなたが望むものではありません。

于 2013-09-10T02:02:02.377 に答える
0

\b が問題を引き起こしていると言う人もいます。必要なのは次のようなものだけかもしれません:

 // ([-+]?[0-9]*\.?[0-9]*(?<=\d\.|\d))

 (                                  # (1 start)
      [-+]? [0-9]* \.? [0-9]* 
      (?<= \d \. | \d )
 )                                  # (1 end)

編集: ログインのコメントが壊れています。
@JNYRangerへ

 \b*-?[0-9]*\.?[0-9]+\b

\b* は、オプションで単語境界に永久に一致することを意味します。
\b? オプションで単語境界に 1 回一致することを意味します。
\b は、単語境界に 1 回一致することを意味します。

\b はゼロ幅のアサーションです。オプションの場合、通常は含めません。

于 2013-09-10T03:16:34.823 に答える