如果包含特定单词,则RegEx匹配字符串

时间:2015-07-01 11:58:13

标签: html regex optimization

这是一个示例文本:

  

[ame = \“watch?v = 12345 \”] YouTube - blah lorem blah blah [/ ame] Lorem Ipsum只是印刷和排版行业的虚拟文本。   Lorem Ipsum自此以来一直是业界标准的虚拟文本   16世纪,当一个未知的打印机拿出一个类型的厨房并乱扰它   制作一本样本书。 [ame = \“watch?v = 123456 \”] YouTube - 等等   blah blah [/ ame] 它不仅存活了五个世纪,而且还存活了下来   电子排版的飞跃,基本保持不变。   它在20世纪60年代随着Letraset床单的推出而普及   包含 [ame = \“watch?v = 1234 \”] YouTube - blahΩblahlorem   [/ ame] Lorem Ipsum段落,最近还有桌面版   像Aldus PageMaker这样的出版软件,包括Lorem的版本   存有。

我需要一个只与[ame] [/ ame]匹配的正则表达式,其中包含单词 lorem 。此外,在上一个[ame]实例中,有一个特殊字符(希腊字母Omega)Ω。我需要一个正则表达式来匹配[ame]和omega(Ω)里面。

我试过(\[ame=[^\]]*\])([lorem])(\[\/ame\])但没有任何反应。请检查here

4 个答案:

答案 0 :(得分:0)

快速解决方案:

(\[ame=[^\]]*\])[^[]*?lorem[^[]*?(\[\/ame\])

我没有以任何方式优化它。

答案 1 :(得分:0)

中间的模式(lorem)不得包含在[]中:

/(\[ame=[^\]]*\]).*(lorem).*(\[\/ame\])/

见这里:https://regex101.com/r/eC9sS5/1

http://regexr.com/3bae0

答案 2 :(得分:0)

由于您没有提及有关群组捕获的任何信息,因此第一个解决方案不会使用它们:

/\[ame[^\[]+lorem[^\[]*\[\/ame\]/g

打破这个局面:

  • \[ame:开始与" ame"打开标签
  • [^\[]+:继续匹配,直到第一次" ["
  • lorem:匹配" lorem"
  • [^\[]*:继续匹配,直到第一次" ["
  • \[\/ame\]:结束与#34; ame"结束标签

特别的酱汁是两个贪婪的比赛,结合了#l; lorem"只会匹配一个" ame"标签包含" lorem"。这种方法并不关心" lorem"发生在标签内(它可能在链接而不是文本中)。

第二个解决方案是,如果你关心捕获组(比如链接和文本值),那么" lorem"仅出现在文本值中。基于第一个解决方案的相同概念,但添加组捕获给出:

/\[ame=\\"([^"]+)\\"\]([^\[]*lorem[^\[]*)\[\/ame\]/g

打破这一个:

  • \[ame=\\"([^"]+)\\"\]:开始与" ame"使用组捕获为链接值打开标记
  • ([^\[]*lorem[^\[]*):匹配包含" lorem"的文本值第二组捕获
  • \[\/ame\]:结束与#34; ame"结束标签

文本值匹配类似于之前解决方案的匹配,但现在认为文本值可能只是" lorem" (因为之前的解决方案只匹配整个标签)。

答案 3 :(得分:0)

所以其他答案仍有相当大的缺陷(不能在[标签之间使用符号ame,而且omega部分也会被忽略,但很容易做到。)

该问题类似于正则表达式HTML解析。如果您希望[ame][/ame]之间的信息,则标签可以在文档过程中重复。这个问题在这里展示:https://regex101.com/r/rC3eK4/1,标签将“跳转”到下一个标签以满足设置要求。为避免这种情况,其他答案指出他们不会在字符列表中允许[。但是,谁能说你不能拥有不同的标签呢? [ame] this is [b]bolded[/b][/ame]

我建议采用两步解决方案。首先使用[ame]提取所有\[ame.*?\].*?\[\/ame\]代码的内容。 https://regex101.com/r/rC3eK4/2。即使内部带有adition标记,也会提取ame标记。 然后,看看您是否可以将内容与\[ame.*?\](?:(.*?lorem.*?)|(.*?Ω.*?))\[\/ame\]提出的内容进行匹配,如https://regex101.com/r/rC3eK4/3所示。它还将捕获您在$1捕获组中所需的内容。