正则表达式捕获Excel工作表行索引,不包括具有数字和其他数字的工作表名称

问题描述 投票:0回答:1

这是我在 StackOverflow 上的第一个问题。 :)

我使用 Excel 文件,我需要在每一行上复制公式,因此我需要为每个新行更改这些公式中的行索引。 为此,我编写了一个正则表达式来捕获公式中的工作表行索引,排除不引用行索引的其他数字(例如:“=2024-17-04”)并排除具有数字的工作表名称(例如:“MATMAS05”) .

除了“排除具有数字的工作表名称”部分之外,它的效果非常好。

我写了这个正则表达式:

[A-Z]((?!MATMAS05)|(?<!"))+(\d+)(?!")

我有这些公式示例,其中要捕获的行索引是 5:

SI(F5="";"";"Z_PACK_TYPE")
MARKET!A5
MARKET!MQ5
MARKET!AB5
MARKET!TX5
MARKET!SX5
MATMAS05!CZ5="3200";MARKET!DA5
SI(MATMAS05!CZ5="3200";MATMAS05!CZ5="3200";MARKET!DA5;"")
SI(L5="";"";"STRING")
SI(MATMAS05!CZ5="3300";MARKET!DA5;"")
SI(ESTVIDE(MARKET!EG5);"";SI(MATMAS05!CZ5="3200";MARKET!EG5;""))

为了测试我的正则表达式,我创建了一个 regex101 保存并分享给您相关的 regex101

但如您所见,我的正则表达式还捕获了我的工作表名称“MATMAS05”的“5”。
我想从我的捕获中排除工作表名称“MATMAS05”。

你知道我的正则表达式在该目标中缺少什么吗?

regex
1个回答
0
投票

你可以使用

<?php
// Enter your code here, enjoy!
$formulas = [
    'SI(F5="";"";"Z_PACK_TYPE")',
    'MARKET!A5',
    'MARKET!MQ5',
    'MARKET!AB5',
    'MARKET!TX5',
    'MARKET!SX5',
    'MATMAS05!CZ5="3200";MARKET!DA5',
    'SI(MATMAS05!CZ5="3200";MATMAS05!CZ5="3200";MARKET!DA5;"")',
    'SI(L5="";"";"STRING")',
    'SI(MATMAS05!CZ5="3300";MARKET!DA5;"")',
    'SI(ESTVIDE(MARKET!EG5);"";SI(MATMAS05!CZ5="3200";MARKET!EG5;""))',
];

$regex = '/(?:(?<!")(?:"")*"[^"]*(?:""[^"]*)*"|\w+!)(*SKIP)(*F)|\b[A-Z]+\K\d+\b/';

foreach ($formulas as $formula) {
    preg_match_all($regex, $formula, $matches);
    var_dump($matches);
}

查看 PHP 演示

正则表达式是

(?:(?<!")(?:"")*"[^"]*(?:""[^"]*)*"|\w+!)(*SKIP)(*F)|\b[A-Z]+\K\d+\b

请参阅正则表达式演示详情

详情

  • (?:(?<!")(?:"")*"[^"]*(?:""[^"]*)*"|\w+!)(*SKIP)(*F)
    - 匹配和跳过:
    • (?<!")(?:"")*"[^"]*(?:""[^"]*)*"
      - 两个
      "
      字符之间的子字符串,内部带有引号转义的
      "
    • |
      - 或
    • \w+!
      - 一个或多个单词字符,然后是一个
      !
      字符
  • |
    - 或
  • \b[A-Z]+\K\d+\b
    - 单词边界,一个或多个 ASCII 大写字母,
    \K
    省略匹配的字符,然后匹配并消耗单词边界后面的一个或多个数字。
© www.soinside.com 2019 - 2024. All rights reserved.