【问题标题】:php regex to match textphp正则表达式匹配文本
【发布时间】:2016-04-05 15:39:02
【问题描述】:

我需要一个 php regex 来匹配下面文本中“最大”不区分大小写的名称“总计”前面没有的文本。

[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

EDIT2 例如,“12 标记”应仅返回不是“Total[:]\s+ 12 标记”或“最大[:]\s+12 标记”

【问题讨论】:

  • 预期输出符合什么规则?
  • 您可以使用debuggex.com 来尝试您的正则表达式,这对理解您在写什么很有帮助。
  • 正则表达式应匹配以下 [1] [1m] [1mk][1mks] [1mark] [1marks] (1mk) 12mk 12 mark 13 mark
  • @Telewa 是的,我知道。但为什么?换句话说,根据什么?
  • 就像我需要从文本中获取单个分数,而不是总分

标签: php regex pcre


【解决方案1】:

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

(使用ignore 大小写。)

说明

第 1 部分

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

第 2 部分

  • 这是真实拍摄的。
  • \d++\s? 数字,后面可能跟一个空格。
  • [^ )\]]* 也可能不是空格,)]

PHP 应该如下所示:

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

print_r($matches[0]);

【讨论】:

  • 谢谢。但不起作用。您可以在这里尝试debuggex.com,如果有效,请提供链接
  • 我没有看到你说的全部是一行的部分,但我已经相应地修复了它。它现在应该可以工作了。
  • ([[]?)(总计|最大值)(?:\:)?\s*[0-9]{1,2}(\s)?(marks|mark)? ([]]?) 将选择我不想要的那些。现在请选择其他人。请看这里debuggex.com/r/-KAMhOzikwvMvgo6
  • 您只想要数字吗?我不知道你最后的评论是什么意思。你试过我更新的解决方案了吗?
  • 我想要所有其他内容,即:'[1] [1m] [1mk][1mks] [1mark] [1marks] (1mk) 12mk 12 mark 13 mark' 在一个数组中
【解决方案2】:

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

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

那么匹配所有你真正需要的内容就简单了:

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

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

【讨论】:

  • 谢谢。但是,那些无用的单词也有需要删除的标记。跟他们。如果我能做到这一点,那肯定没问题。我该怎么做?
  • @Telewa 结果与您描述的完全一样。什么标记? [ ( ) ] 之类的字符?
  • 例如 '12 mark' 应该只返回不是“Total[\:]\s+ 12 mark”或“maximum[\:]\s+12 mark”
猜你喜欢
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
相关资源
最近更新 更多