php 正则表达式,用于删除范围中除D以外的每个字符后面的数字

axr492tv  于 2023-03-16  发布在  PHP
关注(0)|答案(3)|浏览(106)

我想删除范围〈F= ..〉中除D以外的所有类型字符后面的数字。
regex

(?:^<F=(?=.+>)|\G(?!^)).*[^d]\K[0-9]+

1.这可以捕获不在d之后的数字。但是,它不能一次捕获所有的数字。它从后面捕获。当我们删除最后捕获的数字时,它从左到右匹配下一个。
〈F= 1H 9D 6 kl〉实时7 x 1分钟1天1 x 7天
〈F= 1H 9D 6 kl〉右轴7第7天
〈F=1H x 1 m3n1x D 6 kl〉实时数据7
1.数字在=未被捕获后第一个出现。〈F= 1 H9 D 6 kl〉rt 78 d 7
更新编号2:将[^d]更改为(?<!d)可解决此问题
1.匹配过程应介于=和〉之间,〈F= ..〉。但在>之后输入的数字也已被捕获。〈F= 1H 9D 6 kl〉rt 7 8 d 7
更新编号3:在将(?=. +〉)更改为(?=. *〉)并将位置更改为结尾(?:^〈F=|\G(?!^)).*[^d]\K[0-9]+ (?=.*>)解决了这个问题,它只捕获>之前的数字
预期产出:<F=HD6kl>rt78d7

对于所有可能的情况:

输入:〈F= 1H 2D 63 k43 l5〉rt 78 d 7
匹配:〈F= 12深6 3 k 435〉rt 78 d 7
输出:〈F= HD 6 kl〉rt 78 d 7

mklgxw1f

mklgxw1f1#

好的,我们可以把正则表达式分成两部分,稍后再把它们连接起来。

*第1部分-((?<!D)\d+。我们使用负向后查找只匹配前面不带D的数字。
*第2部分-(?=.*?>)。我们只匹配=>之间的数字。假设你的字符串是很好的模板化的,那么我们只需要使用正则表达式正向前瞻查找>就足够了。

将它们连接后的最终正则表达式为((?<!D)\d+)(?=.*?>)
这意味着只匹配前面不带D、后面不带>的数字。

代码段:

<?php

$str = '<F=1H2D63k43l5>rt78d7';
$str = preg_replace('/((?<!D)\d+)(?=.*?>)/i','', $str);
var_dump($str === '<F=HD6kl>rt78d7');

Online Demo

cmssoen2

cmssoen22#

您可以选择匹配后跟数字的D

(?:^<F=|\G(?!^)(?=[^\n>]*>))(?:D\d)?[^\d>\n]*\K\d+

说明

  • (?:备选项的非捕获组
  • ^<F=Assert字符串的开头,然后匹配<F=
  • |
  • \G(?!^)在上一个匹配项的末尾而不是字符串的开头Assert当前位置
  • (?=[^\n>]*>)正前瞻,Assert>以外的可选字符(或换行符),然后匹配>
  • )关闭非捕获组
  • (?:D\d)?可选地匹配后跟一个数字的D字符(或使用\d+表示1+位数)
  • [^\d>\n]*匹配可选字符,而不是数字>或换行符(如果您不想匹配交叉行)
  • \K忘记目前匹配的内容
  • \d+匹配1+位数

请参见regex demoPHP demo

$re = '/(?:^<F=|\G(?!^)(?=[^\n>]*>))(?:D\d)?[^\d>\n]*\K\d+/mi';
$s = '<F=1H2D63k43l5>rt78d7';

echo preg_replace($re, "", $s);

产出

<F=HD6kl>rt78d7
jtjikinw

jtjikinw3#

有了先行和后行功能,一个简单的字符串函数就可以满足您的需求。POC:

<?php
$string = '<F=1H2D63k43l5>rt78d7';
echo "Original: $string\n";
echo "Expected: <F=HD6kl>rt78d7\n";

function formatString($string){
    $end = $extension = strrchr( $string, '>'); // rt78d7

    $chars = str_split($string);
    $count = 0;
    $new_string = ''; 
    foreach ($chars as $key=>$item) {
        $prev = $count-1;
        if( $item == '>' ){
            break;
        }
        if( is_numeric($item) && substr($string, $prev, 1) != 'D' ){
            // do nothing
        } else {
            $new_string .= $item;
        }
        $count++;
    }
    return $new_string.$end;
}

$new = formatString($string);
echo "Actual:   ".$new."\n";

?>

结果:
原件:〈F=1H2D63k43l5〉rt78d7
预期值:〈F=HD6kl〉rt78d7
实际值:〈F=HD6kl〉rt78d7

相关问题