两个标点符号之间的单词表达式



如何使我的文本中的每个字符串在我的文本中找到与此格式相匹配的每个字符串,我尝试添加卷曲括号,但它仅在格式中找到第一个单词,当删除时会找到它每个字。

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

要获得卷曲括号之间的所有匹配,您可以从 {}匹配并捕获捕获组中的内容。

然后使用爆炸并将|用作定界符。如果您有多个结果,则可以循环结果:

$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)上一场比赛的结尾,但在开始时不在
    • |
    • {(?=[^{}]*?})匹配 {并断言以下内容不包含 },然后 }
  • )关闭非捕获组
  • ([^|{}]+)在匹配的组中捕获而不是字符类中列出的内容
  • [|}]匹配字符类中列出的内容

php demo

您可以在基于基于的正则脸上使用此外观,这将为您提供卷曲括号中的所有匹配项,

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

演示

尝试此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
        )
)

在线php demo

最新更新