php 匹配文本的正则表达式

php regex to match text

我需要一个 php regex 来匹配文本中不以 "maximum" 的名称 "Total" 开头且不区分大小写的文本以下。

[1]
[1m]
[1mk][1mks]
[1mark]
[1marks]
(1mk) 
12mk

12 mark
13 mark
[Total: 15]
Total: 16 mark
Total 1 mark
Total 12 mark
Total: 9 mark
Total: 10 mark
[Total: 11 marks] Total 6 mark
maximum 5 marks
maximum:5 marks

注意:此文本占一长行。

正则表达式应匹配以下内容

[1]
[1m]
[1mk][1mks]
[1mark]
[1marks]
(1mk) 
12mk

12 mark
13 mark

这个我试过了,但是不行

/(?<!Total\:\s|Total\s|maximum\s|maximum\:\s)[\[|\(]?([0-9]{1,2})(\s|(?=marks|mark|mks|mk|m|\]))?(\]|marks|mark|mks|mk|m)[\]|\)]?/i

编辑

https://www.debuggex.com/r/yNNN_B3iQmGyYWoz

编辑2 例如 '12 mark' 应该只返回它不是 "Total[:]\s+ 12 mark" 或 "maximum[:]\s+12 mark"

试试这个:(?:\[?\b(?:Total|maximum):?\s?\d+\s?[^ ]+(*SKIP)(*FAIL))|(\d++\s?[^ )\]]*)

(使用 i忽略大小写。)

说明

第 1 部分

  • (?:\[? 可能有 [
  • 的非捕获组
  • \b边界
  • (?:Total|maximum) 非捕获组匹配任一文字
  • :?\s?\d+\s? 可能是 : 可能是 space,一些数字,可能是另一个 space.
  • [^ ]+一堆非space.
  • (*SKIP)(*FAIL))| 剧情转折:与第 1 部分匹配的任何内容都失败了

第 2 部分

  • 这是真实拍摄的。
  • \d++\s? 位,可能后跟 space.
  • [^ )\]]* 也许不是 space、)].

PHP 应该看起来像这样:

preg_match_all(
  '/(?:\[?\b(?:Total|maximum):?\s?\d+\s?[^ ]+(*SKIP)(*FAIL))|(\d++\s?[^ )\]]*)/i', 
  "YOUR STRING",
  $matches
);

print_r($matches[0]);

实际上我会选择两步解决方案。首先清理垃圾词,用这个正则表达式替换它们:

    (Total:?\s?|maximum:?\s?)

然后匹配您真正需要的所有内容很容易:

    \[?\(?([0-9]{1,2}\s?marks?|[0-9]{1,2}\s?mk?s?)\)?\]?

不知道如何使用 debuggex.com 但我在 pspad 中测试了所有正则表达式所以它确实有效。