dea*_*asa 1 regex excel vba excel-vba
我正在努力提出一个正则表达式模式,该模式可以帮助我确定字符串是单元格的地址还是单元格的名称。
以下是一些单元地址的示例:
以下是一些单元名称的示例:
我已经能够想到几种方法来确定什么不是字符串:
,,这三个小测试几乎不能证明这个字符串是什么。
谢谢您的帮助!
好吧,这很有趣:
^\$?[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记号)表示(这表示“任何空白”)。
如果我们真的想花哨(并且,请注意,我不知道Excel的正则表达式引擎是否支持此功能;我只是出于娱乐目的而编写),我们可以使用递归来完成相同的事情:
^((\$?[A-Z]+\$?\d+)(?::(?2))?)(?:,\s*(?1))*$
Run Code Online (Sandbox Code Playgroud)
在这种情况下,魔术\$?[A-Z]+\$?\d+位于第二个捕获组中,该捕获组由(?2)令牌递归使用。单个地址或其范围的整个子模式都包含在第一个捕获组中,然后用于匹配列表中的其他地址或范围。