regex 正则表达式匹配特定字母并排除其余字母

kognpnkq  于 2023-03-04  发布在  其他
关注(0)|答案(2)|浏览(262)
$string='letters=ABCD';

我们要匹配"letters="和字母BC,字符串中的字母可以输入为:

  • B
  • C级
  • 公元前
  • CB如何过滤掉A和D并输出结果为字母=BC?

preg_match('/(letters=([BC]+))/', $string,$matches);

  • 如果字符串中的字母以字母B或C开头,则此匹配可以过滤掉D
  • 字母开始其他字母时不工作

preg_match('/<FORMAT=[A-Z]+[BIU]+/', $string,$matches);

  • 结果中未过滤掉A
pjngdqdw

pjngdqdw1#

您可以尝试:

(?:^letters=|\G(?!^))[BC]*\K[AD-Z]+

查看在线demo

  • (?:^letters=|\G(?!^))-非捕获组,用于匹配输入的开头,如字面上的"letters ="* 或 * Assert上一匹配结尾处的位置,但否定字符串的开头;
  • [BC]*-0+乘以字母"B"或"C";
  • \K-重置上报匹配的起始点;
  • [AD-Z]+-匹配范围"AD-Z"中的1+个大写字母。

替换为空字符串:

echo preg_replace('/(?:^letters=|\G(?!^))[BC]*\K[AD-Z]+/', '', $string);
yh2wf1be

yh2wf1be2#

如果我正确理解了这个问题,你可以用一个空字符串替换下面正则表达式的每个匹配项。

^.*'(?=(?:letters|LETTERS)=[A-Z]+';$)|[AD-Z](?!.*=)|';$

Demo
这个表达式可以分解如下。

^             match beginning of string
.*            match zero or more chars other than line terminators
'             match literal
(?=           begin a positive lookahead
  (?:         begin a non-capture group
    letters   match literal
  |           or
    LETTERS   match literal
  )           end the non-capture group
  =           match literal
  [A-Z]+      match one or more uppercase letters
  ';          match literal
  $           match end of string
)             end the positive lookahead 
|             or
[AD-Z]        match a capital letter other than 'B' or 'C'
(?!           begin a negative lookahead
  .*          match zero or more chars other than line terminators
  =           match literal
)             end the negative lookahead
|             or
';            match literal
$             match the end of the string

相关问题