gpt4 book ai didi

PHP:标记化,使用正则表达式(moSTLy there)

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:44:03 27 4
gpt4 key购买 nike

我想标记格式化字符串(非常类似于 printf),我想我只遗漏了一点点:

  • %[number][one letter ctYymd] 应成为 token ²
  • $1...$10 将成为代币
  • 所有其他(普通文本)都成为标记。

我在 the regExp simulator 中走得很远.这看起来应该这样做:

²更新:现在使用 # 而不是 %。 (少了windows命令行参数的麻烦)

enter image description here

这并不可怕,如果您专注于通过管道连接的三个部分(非此即彼),那么基本上它只是三场比赛。因为我想从头到尾匹配,所以我将东西包裹在 /^...%/ 中,并用一个不匹配的组 (?:... 包围可以重复 1 次或多次:

$exp = '/^(?:(%\\d*[ctYymd]+)|([^$%]+)|(\\$\\d))+$/'; 

我的来源仍然没有交付:

$exp = '/^(?:(%\\d*[ctYymd]+)|([^$%]+)|(\\$\\d))+$/';
echo "expression: $exp \n";

$tests = [
'###%04d_Ball0n%02d$1',
'%03d_Ball0n%02x$1%03d_Ball0n%02d$1',
'%3d_Ball0n%02d',
];

foreach ( $tests as $test )
{
echo "teststring: $test\n";
if( preg_match( $exp, $test, $tokens) )
{
array_shift($tokens);
foreach ( $tokens as $token )
echo "\t\t'$token'\n";
}
else
echo "not valid.";
} // foreach

我得到了结果,但是:匹配顺序不对。第一个 %[number][letter] 永远不会匹配,因此其他匹配双倍:

expression: /^((%\d*[ctYymd]+)|([^$%]+)|(\$\d))+$/ 
teststring: ###%04d_Ball0n%02d$1
'$1'
'%02d'
'_Ball0n'
'$1'
teststring: %03d_Ball0n%02x$1%03d_Ball0n%02d$1
not valid.teststring: %3d_Ball0n%02d
'%02d'
'%02d'
'_Ball0n'
teststring: %d_foobardoo
'_foobardoo'
'%d'
'_foobardoo'
teststring: Ball0n%02dHamburg%d
'%d'
'%d'
'Hamburg'

最佳答案

解决方案(由 OP 编辑​​):我使用了两个细微的变化(仅关于“包装”):首先用于验证,然后用于标记化:

#\d*[ctYymd]+|\$\d+|[^#\$]+

RegEx Demo

代码:

$core = '#\d*[ctYymd]+|\$\d+|[^#\$]+';
$expValidate = '/^('.$core.')+$/m';
$expTokenize = '/('.$core.')/m';

$tests = [
'#3d-',
'#3d-ABC',
'***#04d_Ball0n#02d$1',
'#03d_Ball0n#02x$AwrongDollar',
'#3d_Ball0n#02d',
'Badstring#02xWrongLetterX'
];

foreach ( $tests as $test )
{
echo "teststring: [$test]\n";

if( ! preg_match_all( $expValidate, $test) )
{
echo "not valid.\n";
continue;
}
if( preg_match_all( $expTokenize, $test, $tokens) ) {
foreach ( $tokens[0] as $token )
echo "\t\t'$token'\n";
}

} // foreach

输出:

teststring: [#3d-]
'#3d'
'-'
teststring: [#3d-ABC]
'#3d'
'-ABC'
teststring: [***#04d_Ball0n#02d$1]
'***'
'#04d'
'_Ball0n'
'#02d'
'$1'
teststring: [#03d_Ball0n#02x$AwrongDollar]
not valid.
teststring: [#3d_Ball0n#02d]
'#3d'
'_Ball0n'
'#02d'
teststring: [Badstring#02xWrongLetterX]
not valid.

关于PHP:标记化,使用正则表达式(moSTLy there),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33331068/

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