这是我在 StackOverflow 上的第一个问题。 :)
我使用 Excel 文件,我需要在每一行上复制公式,因此我需要为每个新行更改这些公式中的行索引。 为此,我编写了一个正则表达式来捕获公式中的工作表行索引,排除不引用行索引的其他数字(例如:“=2024-17-04”)并排除具有数字的工作表名称(例如:“MATMAS05”) .
除了“排除具有数字的工作表名称”部分之外,它的效果非常好。
我写了这个正则表达式:
[A-Z]((?!MATMAS05)|(?<!"))+(\d+)(?!")
。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”。
你知道我的正则表达式在该目标中缺少什么吗?
你可以使用
<?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
省略匹配的字符,然后匹配并消耗单词边界后面的一个或多个数字。