当前位置: 首页 > 知识库问答 >
问题:

为什么这个正则表达式空间在最后一场比赛中?

龙德义
2023-03-14

我有以下文字:

2 HCl 12 Na 3(NaCl Cl₂)₂₄ → 2 NaCl H2

我想匹配每个分子,包括它的系数。下面的正则表达式几乎正常工作,但是空格字符,就在最后一次匹配之前,正在匹配,这不应该。这是我正在使用的正则表达式:

([0-9]*??\(*([a-z] [₀-₉]*) \)*[₀-₉]*))

如果您查看这个regex101链接,可能更容易了解我的问题是什么:https://regex101.com/r/hK7jY6/1


共有2个答案

余靖
2023-03-14

虽然维克多的回答非常丰富,但我想我可能已经找到了一种更简单的方法

<代码>([0-9])*[a-z\(₀-₉\)]

据我所知,这将匹配等式的所有部分。

演示

使现代化

请看Wiktors更新的答案,它比这个好。

章学义
2023-03-14
匿名用户

如果字符串只是有效的化学公式,为什么还要麻烦使用下标/数字/字母?有非空白符号。由于必须有一个强制字母或(),请在字符类[a-z(])中使用它们,然后附加(零个或多个非空白):

/(?:\d+ )?[a-z(]\S*/gi

请参阅正则表达式演示。(?:...)?构造是一个可选的非捕获组(即仅用于分组但不捕获的组(=将子匹配存储在内存缓冲区中)。

您在开始时将数字和空格模式作为可选子模式,相反,您需要强制匹配它们,但将其放入可选组中:

(?:[0-9]+ )?\(*([a-z]+[₀-₉]*)+\)*[₀-₉]*

查看正则表达式演示

您的<代码>[0-9]* 变成了一个<代码>(?:[0-9]) 。请注意,这里您不必使用延迟版本的<代码> 量词,它的工作方式与贪婪的一样。我还删除了2个不必要的外部分组。

由于<代码>(?:[0-9]) 组是可选的,只有在前面有数字时才会匹配空格。如果没有数字,则可以匹配的下一个字符为零或更多(。然后,应该存在一个字母(如果没有(),字母将是匹配中的第一个字符)。

让我把它分解一下:

  • (?:[0-9] )? -可选的一个或多个数字后跟空格
  • \(*-零或更多(也许你是指
  • ([a-z] [₀-₉]*) -一个或多个字母的零或多个序列后跟零或多个sbscript数字
  • \)*-零或更多(也许你是指
  • [₀-₉]*-零个或多个下标数字

如果您还想确保您不匹配(CaH),您还应该像这样拆分\(*...\)*

(?:[0-9]+ )?(?:(?:[a-z]+[₀-₉]*)+|\((?:[a-z]+[₀-₉]*)+\))[₀-₉]*

查看另一个演示

 类似资料:
  • 是否可以编写一个正则表达式,其中匹配1的最后一个符号是匹配2的开始符号?我喜欢匹配括号中的所有数字,并用管道隔开。情况也很复杂,因为比赛只能有一组深度。 这是我的字符串: 我想得到: 1234年 但是正则表达式应该不匹配: 我只找到了这个正则表达式{1}(\d)和这个问题,他还匹配了这样的文本(123 Text)。 我有一个关于regex101的例子:https://regex101.com/r/

  • 我正在regex101上测试这个。通用域名格式 正则表达式: 测试字符串: 字符串匹配,但“匹配信息”框显示只有两个捕获组: 我期待着所有这些捕捉: β-bar baz-bz fd zz 为什么周期之间的每个标识符都没有被识别为自己捕获的组?

  • 问题内容: 如何限制e004_n07中匹配/替换前导零?但是,如果任何一项包含全零,那么我需要在该项中保留一个零(请参见下面的示例)。对于输入字符串,第一个值将始终有3位数字,第二个值将始终有2位数字。 输入和输出示例 是否可以单独使用re.sub完成此操作,还是需要使用re.search/re.match? 问题答案: 如果只想在字母后删除零,则可以使用: 替换为反向引用。请参阅regex演示。

  • 问题内容: 试图了解正则表达式,我在重复的部分:。 我有以下代码: 如您所见,两个字符串都不匹配该模式。为什么会这样呢? 问题答案: 您不应该在逗号后加空格,这是多余的。

  • null 应匹配“17个字母数字字符,连字符也可以,必须包括至少一个字母和至少一个数字” 它将正确匹配: 并正确拒绝匹配: null null

  • 这个正则表达式什么意思?这里$1代表什么?