c# - 匹配目录模式的正则表达式

标签 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

最佳答案

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

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

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

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

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

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

match.Groups["first"].Value

matchRegex.MatchRegex.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/

相关文章:

c# - 依赖注入(inject) (DI) 的最佳方法

c# - 将整个文件夹复制到 IsoStorage

c# - 在 C# WPF 中编写漂亮的收据以在热敏打印机 POS 上打印

Python re.sub 去除引号内的前导/尾随空格

c++ - 通过 C++ 从标准输出中的一些打印数据中提取特定值

c# - 如何获取当前 BrowserWindow 的句柄

.net - .NET 4.0 文件系统枚举功能的奇怪之处

c# - .NET 引用源代码中的四个破折号组是什么?

c# - 如何将注意力集中在 WPF 桌面应用程序上?

java - 删除字符串中除 之外的所有内容。以及 0-9 之间的数字 - Java