正则表达式:长度未知的部分名称?

时间:2012-07-16 18:11:31

标签: c# regex

我有一个格式如下的文本块:

1.2.3.4.51.2222.3.4.511.2

未知数量的数字和点(法律文件的部分)

如何将完整部分(1.2.3.4.5)捕获到一个组中?

我使用C#,但任何正则表达式都没问题,我可以翻译它。

3 个答案:

答案 0 :(得分:4)

<强>已更新

使用此Regex

Regex.Matches(inputString, @"\d[\.\d]*(?<!\.)");

解释

\d                       digits (0-9)

[.\d]*                   any character of: '.', digits (0-9) 
                         (0 or more times, matching the most amount possible))

(?<! subexpression)      Zero-width negative lookbehind assertion.

答案 1 :(得分:4)

string s = "1.2.3.4.5 or 1.2222.3.4.5 or 1 or 1.2 or 2222.3333.111.5 etc";
var matches = Regex.Matches(s, @"\d+(\.\d+)*").Cast<Match>()
    .Select(m => m.Value)
    .ToArray();

答案 2 :(得分:1)

好吧,如果你知道你不能超过5,那么你可以做到

@"1+((.2+)((.3+)((.4+)(.5+)?)?)?)?"

你可以为每个符号扩展该模式,最多可以扩展到有限数量的符号

+表示符号出现的次数,但至少为1.如果有效,则可以使用*代替

如果希望捕获模式,请将?:放在开头的父母身上 例如:(?:abc)
我省略了它们以使正则表达式更具可读性。

?在括号之后,表示前一个符号的1或0。

现在,如果您不知道字符串可以走多远,例如

"1.2.3.4......252525.262626.272727.......n.n.n"比我的直觉告诉我你不能用正则表达式做到这一点。