【问题标题】:Regex - Capturing group to return null for a non matching string正则表达式 - 捕获组以为不匹配的字符串返回 null
【发布时间】:2017-03-30 11:48:31
【问题描述】:

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

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

我的输入是这样的。

1.9
2.8
4.76
3
7.8

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

9
8
76
3
8

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

9
8
76

8

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

【问题讨论】:

  • 不,输出肯定不同。见this demo。请分享代码,如果第 3 组为空,我认为您打印输入。
  • 请用 $3 代替。你会得到我的输出
  • 为什么要“替代”?你想匹配,而不是*替代”。这背后的工具/语言/代码是什么
  • Paxata 是工具。本工具只有正则表达式替换功能。
  • 您确定REGEXP(@column@,"([0-9]*)(\\.)([0-9]*)","$3") 返回不受欢迎的数据吗?此外,也许REGEXP(@column@,"([0-9]+)(?:(\\.)([0-9]+))?","$3") 对您更有效(但不确定它是否符合 Paxata 正则表达式语法)。

标签: regex regex-lookarounds capturing-group


【解决方案1】:

我能够使用以下正则表达式来实现这一点。

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

演示:Regex101 Demo

这里只考虑两种情况。

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

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

注意:如果有更多的测试用例,请在问题中说明。由于声誉低,我无法对此发表评论。

【讨论】:

  • 这是一个绝妙的答案!谢谢你。在过去的几个小时里,我一直在扯头发,试图弄清楚如果这群人没有被抓获,如何不归还任何东西。您将 OR [|] 条件放入正则表达式的解决方案非常巧妙。
  • @CharlesRobertson:这在 2016 年得到了回答,很高兴它在 2018 年仍然有用。☺
  • 这就是 StackOverflow 的伟大之处。我猜正则表达式解决方案是永恒的:)
【解决方案2】:

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

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

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

第一个模式寻找:

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

第二个模式寻找:

  1. 第 1 组:从 begging 到 end 至少有一个数字,没有其他字符的文本;
  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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 2021-04-08
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2018-05-11
    • 2022-01-14
    相关资源
    最近更新 更多