3

考虑到

NN = number/digit
x = any single letter

我想匹配这些模式:

1. NN
2. NNx
3. NN.NN
4. NN.NNx
5. NN.NN.NN
6. NN.NN.NNx

需要匹配的示例:

1. 20
2. 20a
3. 20.20
4. 20.20a
5. 20.20.20
6. 20.20.20a

现在我正在尝试使用这个正则表达式:

\b\d+\.?\d+\.?\d+?[a-z]?\b

但如果失败。

任何帮助将不胜感激,谢谢!XD

编辑:

我匹配这个:

<fn:footnote fr="10.23.20a">    (Just a sample)

现在我有一个正则表达式可以提取“10.23.20a”

现在我将检查这个值是否有效,上面的 6 个示例将是唯一将被接受的字符串。

此示例无效:

1. 20.a
2. 20a.20.20
3. etc.

非常感谢您的帮助!:D

4

2 回答 2

1

你总是有\d+,这是一个或多个数字。因此,您至少需要三位数字。尝试将数字与其句点分组:

^\d+(?:[.]\d+){0,2}[a-z]?$

?:只是抑制捕获的优化(和良好实践) 。[.]并且\.完全可以互换,但我更喜欢前者的可读性。选择你最喜欢的。

如果你真的想捕捉数字和字母,有两种选择:

^(?<first>\d+)(?:[.](?<second>\d+))?(?:[.](?<third>\d+))?(?<letter>[a-z])?$

请注意,重要的一点是将句点和数字组合在一起,并使它们一起可选。您也可以使用未命名的组,这并不重要。但是,如果您使用我的版本,您现在可以通过(例如)访问这些部分

match.Groups["first"].Value

wherematch是由或例如Match返回的对象。Regex.MatchRegex.Matches

或者,您可以使用 .NET 在一组中捕获多个值的功能:

^(?<d>\d+)(?:[.](?<d>\d+){0,2}(?<letter>[a-z])?$

现在match.Groups["d"].Captures将包含所有捕获的数字(1 到 3)的列表。如果match.Groups["letter"].Value它在那里,它仍然会包含这封信。

于 2012-12-18T09:03:55.047 回答
0

试试这个

^\d+(?:(?:\.\d+)*[a-z]?)$
于 2012-12-18T09:47:57.517 回答