正则表达式 - 捕获组以返回非匹配字符串的null

时间:2016-11-16 10:14:54

标签: regex regex-lookarounds capturing-group

我正在学习正则表达式。我的要求很简单。这是我的正则表达式。

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

我的意见是这样的。

1.9
2.8
4.76
3
7.8

我只想返回小数部分。我目前正在打印第3个捕获组3美元。输出是这样的。

9
8
76
3
8

但我的预期输出是这个。

9
8
76

8

请告诉我如何实现这一目标。每当字符串不匹配时,我的$ 3返回整个字符串。我希望它返回null或任何其他默认值(例如' 0')。是否有可能使用外观来实现这一目标?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:2)

我能够使用以下正则表达式实现此目的。

正则表达式:(\d*)(\.)(\d+)|(^\d+$)()()

演示:Regex101 Demo

这只考虑了两种情况。

  1. 小数部分的数字匹配并在组$3中捕获。

  2. 没有小数部分的数字,因此在组$3中捕获零宽度。

  3. 注意:如果有更多测试用例,请指明相关内容。由于声誉不佳,我无法对此发表评论。

答案 1 :(得分:2)

选择的答案实际上并不是一个好答案,因为它仅在某些情况下有效,但并非全部。

给出的答案使正则表达式查找两种不同的可接受模式(以“或” |字符分隔):

(\d*)(\.)(\d+)(^\d+$)()()

第一个模式寻找:

  1. 第1组:一个零或多次(\d*)的数字位数;
  2. 第2组:至少一次(\.)的点;
  3. 第3组:一次或多次(\d+)

第二种模式寻找:

  1. 第1组:一种文本,从开始到结尾至少只有一个数字,没有其他字符;
  2. 第2组和第3组:什么都没有;

此方法的第一个问题是,您需要在第一个模式选项中的数字与您要的数字完全相反的情况下,该数字在小数点上至少具有一个数字。第二个问题是,您正在对第二个选项的最后两组硬编码一个空答案。

正确的方法是捕获并准确接收每组中的内容,第一组为整数值,第二组为点,第三组为小数。

您必须考虑每个小组:

  1. 第1组:数字,因此\ d。是.1的一个选择,还是只应该抓住0.1?两者都是上一个答案中的选项。如果要使用空整数,则应使用*(零次或多次)。如果您不希望使用空整数,请使用+(多次出现)。
  2. 第2组:点。由于点是特殊字符,因此我们需要使用\.之类的转义字符。点应该是可选的,对不对?因此,您应该使用?字符(零次或一次)。
  3. 第3组就像第1组。

因此正确的答案应该是:(\d*)(\.?)(\d*) 这个简单的答案将为您提供$1中的整数,$2中的点和$3中的小数,什么都没有。

因此,在示例中

$1会给您:

1
2
4
3
7

$2会给您:

.
.
.

.

$3会给您:

9
8
76

8

这将是一种更简单的阅读,理解方式,并且正则表达式无需检查字符串的每个部分是否具有两种不同的模式。