[英]Need clarification(help) with regular expression
好吧,我有一个用空格分隔的词组。 每个元素只能是整数或实数,最后两个元素可以为字符串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-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)
他们将再也无法匹配“ nothing”,并且会按照您希望的方式排列。
您也可以将其翻转,并使其强制匹配为“ null”(无内容):
([0-9]*\.[0-9]*|null|[0-9]*)
如果您始终希望使用以下格式:
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或更大。
实数的十进制组必须通过?
设置为可选?
,并且由于整数不是可选的,因此请使用+
代替*
。
(\d+(?:\.\d+)?) (\d+(?:\.\d+)?) ((\d+(?:\.\d+)?)|null) ((\d+(?:\.\d+)?)|null)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.