正则表达式使用{{}}符号捕获一个奇怪的字符串

时间:2016-01-03 19:14:42

标签: php regex pattern-matching text-extraction

字符串示例

{{ai|Perseverance|Garen}} is no longer removed by combat dehancing effects such as {{ai|Blood Scent|Warwick}}.

我希望从{{ai|Perseverance|Garen}}抓住{{ai| |Garen}},并将中间部分与{{ai| |Warwick}}

保持一致

这就是我提出的:

(\{\{ai\|)\w+(\|\w+\}\})

它与第一个机器人非常接近,但是使用Perserverance,我可以使用{{ai| and then |Garen}}首先使用(\{\{ai\|)然后使用(\|\w+\}\})进行两次正则表达式。

有没有办法在一个正则表达式中执行此操作?

更新:我使用PHP只是为了清楚

2 个答案:

答案 0 :(得分:1)

您的比赛是以下正则表达式的第1组

\{\{[^|]*\|([^|]*)

答案 1 :(得分:1)

我假设您要删除{{some||thing}}部分,并保留中间的内容。

您可以使用

{{[^|]*\|([^|]*)\|[^|]*}}

$1作为替换模式。

正则表达式意味着:

  • {{ - 两个文字{符号
  • [^|]*\| - 除|以外的零个或多个字符([^|]*)后跟文字|
  • ([^|]*) - 与|
  • 以外的零个或多个字符匹配的第1组
  • \| - 文字|
  • [^|]* - 除|
  • 以外的零个或多个字符
  • }} - 关闭}}

请参阅demo

请注意,当| / {{内有3 }}个分隔的部分时,它们会有用。

在PHP中,您可以使用following code

$re = '~{{[^|]*\|([^|]*)\|[^|]*}}~'; 
$str = "{{ai|Perseverance|Garen}} is no longer removed by combat dehancing effects such as {{ai|Blood Scent|Warwick}}"; 
$result = preg_replace($re, '\1', $str);
echo $result;
// => Perseverance is no longer removed by combat dehancing effects such as Blood Scent