考虑
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
答案 0 :(得分:1)
您始终拥有\d+
,这是一位数或多位数。所以你需要至少三位数。尝试使用句点对数字进行分组:
^\d+(?:[.]\d+){0,2}[a-z]?$
?:
只是一种抑制capturing的优化(和良好做法)。 [.]
和\.
完全可以互换,但我更喜欢前者的可读性。选择你最喜欢的任何东西。
如果你真的想捕捉数字和字母,有两个选择:
^(?<first>\d+)(?:[.](?<second>\d+))?(?:[.](?<third>\d+))?(?<letter>[a-z])?$
请注意,重点是将句点和数字组合在一起,并将它们组合在一起。你也可以使用未命名的组,这并不重要。但是,如果您使用我的版本,您现在可以通过(例如)
访问这些部分match.Groups["first"].Value
其中match
是Match
或Regex.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]?)$