好的,我有一个用空格分隔的短语。每个元素只能是整数或实数,但最后两个元素除外,它们可以是字符串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)
答案 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)