【问题标题】:Simplify & Fix Regex简化和修复正则表达式
【发布时间】:2014-06-27 15:50:52
【问题描述】:

我是使用正则表达式的新手,想知道是否可以以某种方式简化以下正则表达式...

{{(?:[\s]+)?(.*)([\s]+)?}}

我正在尝试从以下模式中提取字符串...

{{SOME_STRING}}
{{    SOME_STRING}}
{{  SOME_STRING   }}
{{  SOME-STRING      }}
{{  SomE STRING  }}

此外,它并不完全正确,因为匹配中不应有任何尾随空格。

Regex101 链接:http://regex101.com/r/kT9yT5

【问题讨论】:

  • 写一个\s*而不是(?:[\s]+)?

标签: php regex


【解决方案1】:

对于直接匹配,使用\KMagic

{{\s*\K[^}]+?(?=\s*}})

See demo.

说明

  • {{\s* 匹配左大括号和任何空白字符
  • \K 告诉引擎从它返回的最终匹配中删除匹配的内容
  • 否定字符类 [^}]+? 延迟匹配任何字符,直到...
  • 前瞻 (?=\s*}}) 可以断言后面是空格和右大括号的点。

示例代码

查看live php demo底部的输出。

$regex = '~{{\s*\K[^}]+?(?=\s*}})~';
preg_match_all($regex, $yourstring, $matches);
print_r($matches[0]);

输出

[0] => SOME_STRING
[1] => SOME_STRING
[2] => SOME_STRING
[3] => SOME-STRING
[4] => SomE STRING

【讨论】:

    【解决方案2】:

    比赛中不应有任何尾随空格

    您可以尝试下面的正则表达式并获取匹配的组

    /{{\s*(.*?)\s*}}/g
    

    这意味着包含在{{}} 中的所有内容都使用不情愿的量词进行分组。

    这里是Online Demo

    阅读更多关于Greedy vs. Reluctant vs. Possessive Quantifiers

    【讨论】:

    • @Braj 你需要转义花括号。
    • @AvinashRaj 我不这么认为。
    【解决方案3】:

    您可以尝试以下正则表达式来删除 {} 中存在的所有尾随和开头空格,

    \{\{\s*(\w+[-\s]?\w+)\s*\}\}
    

    DEMO

    说明:

    • \{\{ 文字开口花括号 {{
    • \s* 零个或多个空格。
    • \w+ 一个或多个单词字符。
    • [-\s]? 可选 - 或空格字符。
    • \w+ 一个或多个单词字符。
    • \s* 零个或多个空格字符。
    • \}\} 文字闭合花括号 }}

    你的代码会是,

    $regex = '~\{\{\s*(\w+[-\s]?\w+)\s*\}\}~';
    preg_match_all($regex, $yourstring, $matches);
    print_r($matches[1]);
    

    Ideone

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多