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

use*_*971 0 regex capturing-group regex-lookarounds

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

([0-9]*)(\.)([0-9]*)
Run Code Online (Sandbox Code Playgroud)

我的输入是这样的。

1.9
2.8
4.76
3
7.8
Run Code Online (Sandbox Code Playgroud)

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

9
8
76
3
8
Run Code Online (Sandbox Code Playgroud)

但我的预期输出是这样的。

9
8
76

8
Run Code Online (Sandbox Code Playgroud)

请告诉我如何实现这一目标。每当字符串不匹配时,我的 $3 都会返回整个字符串。我希望它返回 null 或任何其他默认值(如“0”)。是否可以使用环视来实现这一点?如果是这样,怎么办?

小智 5

所选择的答案实际上并不是一个好的答案,因为它只适用于某些情况,但并非全部。

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

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

第一个模式寻找:

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

第二个模式寻找:

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

这种方法的第一个问题是,您要求数字在第一个模式选项中的小数位上至少有一个数字,而这与您想要的完全相反。第二个问题是您在第二个选项的最后两组上硬编码了一个空答案。

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

您必须考虑每个组:

  1. 第一组:数字,所以 \d。是.1一个选项,还是应该只抢0.1?两者都是上一个答案中的选项。如果您想要一个空整数,那么您应该使用*(零次或多次出现)。如果您不需要空整数,请使用+(多次出现之一)。
  2. 第 2 组:点。由于点是特殊字符,因此我们需要使用转义字符,例如\.。点应该是可选的,对吗?所以您应该使用该?字符(出现零次或一次)。
  3. 第 3 组与第 1 组类似。

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

所以,在例子中

$1会给你:

1
2
4
3
7
Run Code Online (Sandbox Code Playgroud)

$2会给你:

.
.
.

.
Run Code Online (Sandbox Code Playgroud)

$3会给你:

9
8
76

8
Run Code Online (Sandbox Code Playgroud)

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