gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:04:10 24 4
gpt4 key购买 nike

我有以下文字:
2 HCl + 12 Na + 3 (Na₃Cl₂)₂₄ → 2 NaCl + H₂
我想匹配每个分子,包括它的系数。下面的正则表达式几乎可以正常工作,但是就在最后一次匹配之前的空格字符正在匹配,这是不应该的。这是我正在使用的正则表达式:
(([0-9]* ??\(*([a-z]+[₀-₉]*)+\)*[₀-₉]*))
如果您查看这个 regex101 链接,可能更容易看出我的问题是什么:
https://regex101.com/r/hK7jY6/1

最佳答案

更新
如果您的字符串只是有效的化学式,为什么还要使用下标/数字/字母?有非空白符号。因为必须有一个强制性的信件或( , 在字符类 [a-z(] 中使用它们,然后附加 \S* (零个或多个非空格):

/(?:\d+ )?[a-z(]\S*/gi
regex demo . (?:...)?构造是一个可选的非捕获组(即仅用于分组但不用于捕获(=将子匹配存储在内存缓冲区中)的组。
原始答案并解释了根本原因
您将开头的数字和空格模式作为可选子模式,相反,您需要强制匹配它们,但放入一个可选组中:
(?:[0-9]+ )?\(*([a-z]+[₀-₉]*)+\)*[₀-₉]*
regex demo
您的 [0-9]* ??变成了 (?:[0-9]+ )? .请注意,这里您不必使用 ? 的懒惰版本。量词,它将以与贪婪相同的方式工作。我还删除了 2 个不必要的外部分组 (...) .
(?:[0-9]+ )? group 是可选的,只有在它前面有一个数字时才会匹配空格。如果没有数字,下一个可以匹配的字符是零个或多个 ( .然后,一个 [a-z]字母应该存在(如果没有 ( ,字母将是匹配中的第一个字符)。
让我分解一下:
  • (?:[0-9]+ )? - 可选的一位或多位数字后跟一个空格
  • \(* - 零个或多个 ( (也许你的意思是 ?)
  • ([a-z]+[₀-₉]*)+ - 零个或多个由一个或多个字母组成的序列,后跟零个或多个 sbscript 数字
  • \)* - 零个或多个 ) (也许你的意思是 ?)
  • [₀-₉]* - 零个或多个下标数字

  • 如果您还想确保您不匹配 (CaH) ,您还应该拆分 \(*...\)*像这样:
    (?:[0-9]+ )?(?:(?:[a-z]+[₀-₉]*)+|\((?:[a-z]+[₀-₉]*)+\))[₀-₉]*
    another demo

    关于regex - 为什么这个正则表达式空间在最后一场比赛中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35242459/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com