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",第二个浮点数没有减号。

我调试了可以确认“-”不在matches var结果中的代码。

我还测试了以下正则表达式,结果相同:

[-+]?[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

对于您正在阅读的字符串,您的正则表达式在上面的代码中是错误的。如果您使用 c# 的正则表达式测试器,您会看到上述正则表达式"\b-?[0-9]*\.?[0-9]+\b"不包含减号。如果你稍微改变它,那么你将在比赛中"\b*-?[0-9]*\.?[0-9]+\b"捕捉到标志。-

来源:http ://regexhero.net/tester/

于 2013-09-10T01:48:45.443 回答
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? 表示可选地匹配一个单词边界一次。
\b 表示匹配一个单词边界一次。

\b 是一个零宽度断言,如果它是可选的,通常不包括它。

于 2013-09-10T03:16:34.823 回答