两个标点之间的单词的正则表达式

时间:2019-02-25 18:11:07

标签: php regex

如何使此正则表达式表达式查找文本中与此格式匹配的每个字符串,我尝试添加花括号,但它只能找到格式中的第一个单词,而在删除时会找到每个单词。

My regex expression: {((?:[a-z][a-z0-9_]*))
My text: {Hello|Hi|Hey} John, How are you? I'm fine

2 个答案:

答案 0 :(得分:1)

您可以使用这种基于环视的正则表达式,它将所有括号中的匹配项都显示在

(?<=[{|])\w+(?=[|}])

Demo

尝试此Python代码,

$s = "{Hello|Hi|Hey} John, How are you? I'm fine";
preg_match_all('/(?<=[{|])\w+(?=[|}])/',$s,$matches);
print_r($matches);

Array
(
    [0] => Array
        (
            [0] => Hello
            [1] => Hi
            [2] => Hey
        )

)

Online PHP demo

答案 1 :(得分:1)

要获取大括号之间的所有匹配项,您可以匹配{}并捕获捕获组之间的匹配。

然后使用explode并将|用作分隔符。如果有多个结果,则可以循环结果:

$str = "My text: {Hello|Hi|Hey} John, How are you? I'm fine";
preg_match_all('~{([^}]+)}~', $str, $matches);

foreach($matches[1] as $match) {
    print_r(explode('|', $match));
}

结果

Array
(
    [0] => Hello
    [1] => Hi
    [2] => Hey
)

Php demo

另一种选择可能是利用\G锚点:

(?:\G(?!\A)|{(?=[^{}]*?}))([^|{}]+)[|}]

说明

  • (?:非捕获组
    • \G(?!\A)上一场比赛的结尾,但没有在开头
    • |
    • {(?=[^{}]*?})匹配{并断言以下内容不包含},然后包含}
  • )关闭非捕获组
  • ([^|{}]+)在与character class
  • 不匹配的组中捕获
  • [|}]匹配字符类中列出的内容

php demo