用正则表达式确定字符串是区域名称还是单元格地址

dea*_*asa 1 regex excel vba excel-vba

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

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

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

以下是一些单元名称的示例:

  • “ bis_document_id”
  • “ PCR1MM_YPCVolume”
  • “ sheet_error7”
  • “ blahE5”
  • “ training_A1”
  • “ myNameIsGeorgeJR”

你们是否可以找到一种正则表达式模式,该模式可以匹配任一组中的任何一个,而其他任何一个都不匹配?

我已经能够想到几种方法来确定什么不是字符串:

  • 如果其中包含“ $”或“:”以外的任何其他字符,我知道它不是单元格的名称,很可能是单元格的地址。
  • 如果它具有三个以上的连续数字,则很可能不是单元格的地址。
  • 单元格的地址极不可能在数字前包含两个以上的字母,其中99.9%的单元格地址将在A到ZZ列中。

,,这三个小测试几乎不能证明这个字符串是什么。

谢谢您的帮助!

Seb*_*icz 5

好吧,这很有趣:

^\$?[A-Z]+\$?\d+(?::\$?[A-Z]+\$?\d+)?(?:,\s*(?:\$?[A-Z]+\$?\d+(?::\$?[A-Z]+\$?\d+)?))*$
Run Code Online (Sandbox Code Playgroud)

让我们分解一下,因为它很讨厌。实际上,魔术子模式是这样的:

\$?[A-Z]+\$?\d+
Run Code Online (Sandbox Code Playgroud)

这个小东西将与任何单个有效单元格地址匹配,并带有可选的绝对值$s。下一点

(?::\$?[A-Z]+\$?\d+)?
Run Code Online (Sandbox Code Playgroud)

将可选地匹配相同的内容(?末尾的量词),但以冒号(:)开头。那让我们得到范围。下一点

(?:,\s*(?:\$?[A-Z]+\$?\d+(?::\$?[A-Z]+\$?\d+)?))*
Run Code Online (Sandbox Code Playgroud)

匹配与第一次匹配的东西,但是匹配零次或多次(使用*量词),并以逗号和可选空格(使用特殊\s记号)表示(这表示“任何空白”)。

Regex101上的演示

如果我们真的想花哨(并且,请注意,我不知道Excel的正则表达式引擎是否支持此功能;我只是出于娱乐目的而编写),我们可以使用递归来完成相同的事情:

^((\$?[A-Z]+\$?\d+)(?::(?2))?)(?:,\s*(?1))*$
Run Code Online (Sandbox Code Playgroud)

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

Regex101上的演示