如何编写正则表达式来查找由句点分隔的一个或多个数字而不返回最后一个句点?

时间:2011-03-11 04:10:11

标签: regex pattern-matching

如何编写正则表达式以找到以句点分隔的一到三位数之间的而不返回最后一段?例如,找到字符串

1.1.

并且还需要匹配

1.1

或只是

1

同样,它需要支持一到三位数,所以

11.11.11

111.111.111

也需要工作。

所以..字符串并不总是以句号结束,但也可能。此外,如果它以句号结束,则不返回最后一个句点(因此,使用正向前瞻)。因此,1.1.如果匹配则会返回1.1

这是我到目前为止所做的,但我很难找到一种不返回最后一段时间的方法:

(\d{1,3}\.?)+(?=(\Z|\s|\-|\;|\:|\?|\!|\.|\,|\)))

它正在返回

6.6.

但我希望它返回

6.6

4 个答案:

答案 0 :(得分:3)

您需要:匹配d.d.d.d.或者d.d.dxxx,无论它是否以“。”结尾。或不,总是停在最后一个d(从不到点)。

只是:(\d(\.\d)*)

有什么问题

如果您希望您的虚线数字字符串被一组字符终止,请在其后面进行预测,就像您在问题中一样:

(\d(\.\d)*)(?=(\Z|\s|\-|\;|\:|\?|\!|\.|\,|\)))

如果您还希望它匹配独立字符串(带或不带终结符),请添加?在预见之后:

(\d(\.\d)*)(?=(\Z|\s|\-|\;|\:|\?|\!|\.|\,|\)))?

对于多个数字,只需将\ d替换为\ d {1,3}等。

答案 1 :(得分:1)

正则表达式(\d{1,3}(?:\.\d{1,3})*)\.{0,1}应该有用。

组1 (如果组0 作为整个匹配项)中,将存储您要保留的字符串,而不是.结束,以防它包含它。

它基本上是这样的:

  • 开始匹配1-3位数
  • 然后匹配.d.dd.ddd
  • 等字符串
  • 如果匹配以.结尾,则不会接受,因为它不在组内。

进行测试并告诉我们是否适用于您的所有示例。

修改

+替换为*

答案 2 :(得分:0)

/\d{1,3}(\.\d{1,3})*/

快速解释:

\d{1,3}  # Match 1-3 digits
(        # Start Capture Group 1
  \.       # Match '.'
  \d{1,3}  # Match 1-3 digits
)*       # End Capture Group 1 - match 0 or more times

答案 3 :(得分:-3)

您可以编写自己的正则表达式并使用以下站点上的虚拟数据进行测试:

http://myregexp.com/