需要澄清(帮助)正则表达式

时间:2012-03-29 02:33:51

标签: java regex

好的,我有一个用空格分隔的短语。每个元素只能是整数或实数,但最后两个元素除外,它们可以是字符串null。我的正则表达式是

([0-9]*\.[0-9]*|[0-9]*) ([0-9]*\.[0-9]*|[0-9]*) ([0-9]*\.[0-9]*|[0-9]*) ([0-9]*\.[0-9]*|[0-9]*|null) ([0-9]*\.[0-9]*|[0-9]*|null)

我不明白为什么用短语

123 15 3 null null

不会捕获最后一个null。有人提到使用'/'并告诉我它们就像正则表达式的引号一样,但在我看来,只需通过正则表达式搜索该字符串即可。我正在以这种形式编写我的正则表达式,因为我将它实现为java并需要相应地分离组或元素。

编辑: 谢谢大家的好评。显然我需要更多练习,可能还有一些睡眠!我的正则表达式现在看起来更干净了。

修订表达

(\d+\.\d+|\d+) (\d+\.\d+|\d+) (\d+\.\d+|\d+) (\d+\.\d+|\d+|null) (\d+\.\d+|\d+|null)

3 个答案:

答案 0 :(得分:2)

这是由于您使用*修饰符定义您的或组的方式:

 ([0-9]*\.[0-9]*|[0-9]*|null)

通过上述声明,可以与[0-9] *匹配。如果可以,它将首先匹配。

当你连续2个时:

([0-9]*\.[0-9]*|[0-9]*|null) ([0-9]*\.[0-9]*|[0-9]*|null)

它现在被迫匹配第一组中的'null',但可以在第二组中没有匹配任何内容。

如果您要将这些捕获组修改为:

([0-9]*\.[0-9]*|[0-9]+|null)

他们将无法再与“无所谓”相匹配,并按照你想要的方式排列。

你也可以翻转它,并在没有任何东西之前强制它匹配'null':

([0-9]*\.[0-9]*|null|[0-9]*)

答案 1 :(得分:1)

如果您总是期望以下格式:

Number Number Number Number|null Number|null

以下正则表达式将匹配它:

([0-9]+\.[0-9]+|[0-9]+) ([0-9]+\.[0-9]+|[0-9]+) ([0-9]+\.[0-9]+|[0-9]+) ([0-9]+\.[0-9]+|[0-9]+|null) ([0-9]+\.[0-9]+|[0-9]+|null)

*表示0或更多,而+表示1或更多。

答案 2 :(得分:1)

必须使用?将实数的小数组设为可选,并且由于整数不是可选的,因此请使用+代替*

(\d+(?:\.\d+)?) (\d+(?:\.\d+)?) ((\d+(?:\.\d+)?)|null) ((\d+(?:\.\d+)?)|null)