考虑
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
最佳答案
您总是有 \d+
,它是一位或多位数字。所以你至少需要三位数。尝试用句点对数字进行分组:
^\d+(?:[.]\d+){0,2}[a-z]?$
?:
只是一种抑制 capturing 的优化(也是一种好的做法) . [.]
和 \.
完全可以互换,但我更喜欢前者的可读性。选择你最喜欢的。
如果你真的想捕获数字和字母,有两种选择:
^(?<first>\d+)(?:[.](?<second>\d+))?(?:[.](?<third>\d+))?(?<letter>[a-z])?$
请注意,重要的一点是将句点和数字组合在一起,并使它们一起可选。您也可以使用未命名的组,这并不重要。但是,如果您使用我的版本,您现在可以通过(例如)访问这些部分
match.Groups["first"].Value
match
是 Regex.Match
或 Regex.Matches
返回的 Match
对象。
或者,您可以使用 .NET 的一个组捕获多个值的功能:
^(?<d>\d+)(?:[.](?<d>\d+){0,2}(?<letter>[a-z])?$
现在 match.Groups["d"].Captures
将包含所有捕获数字(1 到 3)的列表。如果字母存在,match.Groups["letter"].Value
仍将包含该字母。
关于c# - 匹配目录模式的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13929451/