正则表达式匹配目录模式

时间:2012-12-18 09:01:55

标签: c# .net regex

考虑

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

2 个答案:

答案 0 :(得分:1)

您始终拥有\d+,这是一位数或多位数。所以你需要至少三位数。尝试使用句点对数字进行分组:

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

?:只是一种抑制capturing的优化(和良好做法)。 [.]\.完全可以互换,但我更喜欢前者的可读性。选择你最喜欢的任何东西。

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

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

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

访问这些部分
match.Groups["first"].Value

其中matchMatchRegex.Match返回的Regex.Matches个对象。

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

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

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

答案 1 :(得分:0)

试试这个

^\d+(?:(?:\.\d+)*[a-z]?)$