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 中测试了所有正则表达式所以它确实有效。
我需要一个 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 中测试了所有正则表达式所以它确实有效。