gpt4 book ai didi

正则表达式确定字符串是范围名称还是单元格地址

转载 作者:行者123 更新时间:2023-12-03 23:31:02 25 4
gpt4 key购买 nike

我正在努力想出一个正则表达式模式,它可以帮助我确定字符串是单元格的地址还是单元格的名称。

以下是单元格地址的一些示例:

  • "E5"
  • "AA55:E5"
  • “DD5555:DDD55555, E5, F5:AA55”
  • "$F7:$G$7"

  • 以下是单元格名称的一些示例:
  • "bis_document_id"
  • “PCR1MM_YPCVolume”
  • "sheet_error7"
  • "blahE5"
  • "训练_A1"
  • “我的名字是乔治JR”

  • 有没有你们可以想出的正则表达式模式,它可以匹配任一组的所有组而不匹配其他组?

    我已经能够想到几种方法来确定字符串不是什么:
  • 如果其中包含除“$”或“:”之外的任何其他字符,我知道它不是单元格的名称,很可能是单元格的地址。
  • 如果它有超过三个连续的数字,它很可能不是一个单元格的地址。
  • 一个单元格的地址极不可能在数字前有两个以上的字母,99.9% 的单元格地址将在 A 到 ZZ 列中。

  • 唉,这三个小测试几乎无法证明这个字符串是什么。

    谢谢您的帮助!

    最佳答案

    好的,这个很有趣:

    ^\$?[A-Z]+\$?\d+(?::\$?[A-Z]+\$?\d+)?(?:,\s*(?:\$?[A-Z]+\$?\d+(?::\$?[A-Z]+\$?\d+)?))*$

    让我们分解它,因为它相当讨厌。实际上,神奇的子模式是这样的:
    \$?[A-Z]+\$?\d+

    这个小东西将匹配任何单个有效单元格地址,可选绝对值 $ s。下一点,
    (?::\$?[A-Z]+\$?\d+)?

    将可选地匹配相同的东西(最后的 ? 量词),但前面有一个冒号( : )。这让我们得到范围。下一点,
    (?:,\s*(?:\$?[A-Z]+\$?\d+(?::\$?[A-Z]+\$?\d+)?))*

    匹配与第一个相同的内容,但匹配零次或多次(使用 * 量词),并在逗号和可选空格之前使用特殊的 \s 标记(表示“任何空格”)。

    Demo on Regex101

    如果我们想要真正花哨(而且,请注意,我不知道 Excel 的正则表达式引擎是否支持这一点;我只是为了好玩而写的),我们可以使用 recursion 来完成同样的事情:
    ^((\$?[A-Z]+\$?\d+)(?::(?2))?)(?:,\s*(?1))*$

    在这种情况下,神奇的 \$?[A-Z]+\$?\d+ 位于第二个捕获组内,由 (?2) token 递归使用。单个地址或它们的范围的整个子模式包含在第一个捕获组中,然后用于匹配列表中的其他地址或范围。

    Demo on Regex101

    关于正则表达式确定字符串是范围名称还是单元格地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40369371/

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