首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取{.}内的所有字符(如果不包含"{“和"}”)

问获取{.}内的所有字符(如果不包含"{“和"}”)
EN

Stack Overflow用户
提问于 2016-04-18 10:13:04
回答 2查看 89关注 0票数 2

我要抓住{ ... }里面所有的角色,

如果在里面找不到"{“和"}”

例如:

代码语言:javascript
复制
{amdnia91(\+wowa}

抓住它。

代码语言:javascript
复制
{amdn{ia91(\+wowa}

不捕获(包含"{")。

代码语言:javascript
复制
preg_match_all('#(.+?)\{(.+?)\}#', $input, $output);

怎么修呢?

编辑。解释得更多:

我将尝试创建css扫雷器。但在这里,我需要将括号中的所有名称和内容作为单独的数组值捕获。

Curret $input如下所示:

代码语言:javascript
复制
.something{property:value;prop2:value}#something2{someprop:val;prop:val}

它也被缩小,因此包含多个.{}.{}内联。我的代码很好但是..。如果在括号内括起它的括号,也会捕获它,但如果其中包含括号,则不希望捕获它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-18 10:19:00

[^}{]意味着匹配任何不是}或{的字符。

所以:

代码语言:javascript
复制
preg_match_all('#\{([^}{]+)\}#', $input, $output);

但是,请注意,在{amdn{ia91(+wowa}示例中,这将与ia91(+wowa片段匹配。

编辑

如果对第二个示例根本不需要任何匹配,请尝试如下:

代码语言:javascript
复制
preg_match_all('#^[^}{]*\{([^}{]+)\}[^}{]*$#', $input, $output);

破坏的判罚意味着:

  • ^ -行的开头
  • [^}{]* -任何不是{或}零或多次的字符
  • \{ -文字{字符
  • ([^}{]+) -捕获一个或多个不是{或}的字符
  • \} -文字}字符
  • [^}{]* -任何不是{或}零或多次的字符
  • $ -行的末尾

游行示威

第二版

鉴于你对所需的进一步解释,我建议如下:

代码语言:javascript
复制
preg_match_all('#(?<=^|})[^}{]*?\{([^}{]+?)\}(?=[^}]*$|[^}]*\{)#', $input, $output);

这使用了“前瞻性”和“前瞻性”。分解,这意味着:

  • (?<=^|})查找后面:断言这要么是行的开始,要么是前面的字符是文字'}‘,但不包括该字符作为整个匹配的一部分。
  • [^}{]*? -懒惰地匹配不为{或}的零或多个字符。
  • \{ -文字{
  • ([^}{]+?) -懒散地捕获一个或多个不是{或}的字符
  • \} -A文字}
  • (?=[^}]*$|[^}]*\{) -向前看:确保以下字符为零或多个字符,行结束后不},或零个或多个字符不是}后面跟着文字{,但不包括这些字符作为整个匹配的一部分

游行示威

票数 3
EN

Stack Overflow用户

发布于 2016-04-18 10:15:23

我发布了一种替代daiscog发布的regex的方法,基于匹配我们不需要的内容并省略它的概念,并且只在PCRE (*SKIP)(*FAIL)谓词的帮助下匹配我们稍后需要的内容:

代码语言:javascript
复制
[#.]?[^{}]*{[^{}]*[{}][^{}]*}(*SKIP)(*F)|[#.]?[^{}]*{([^{}]+)}

见regex演示

它匹配什么?

  • [#.]?[^{}]*{[^{}]*[{}][^{}]*}(*SKIP)(*F) --一个可选的.或# (参见[#.]?),后面跟着{和}以外的0+字符(参见[^{}]*),后面跟着[^{}]*,后面跟着{或} (请参见[{}]),然后再加上[^{}]*和结束d20。此部分与字符串(如.something{或nothing )匹配。然后,一旦匹配,从由于(*SKIP)(*FAIL)谓词返回的匹配中丢弃此匹配。
  • | -或者.
  • [#.]?[^{}]*{([^{}]+)} --一个可选的.或# (参见[#.]?),后面跟着{和}以外的0+字符(参见[^{}]*),然后是{,然后是大括号([^{}]+)以外的1+字符和一个大括号}。这是我们将保持和得到的火柴。

PHP演示

代码语言:javascript
复制
$re = '~[#.]?[^{}]*{[^{}]*[{}][^{}]*}(*SKIP)(*F)|[#.]?[^{}]*{([^{}]+)}~'; 
$str = "{amdnia91(+wowa}\n{amdn{ia91(+wowa}\n.something{property:value;prop2:value}#something2{someprop:val;prop:val}\n.something{property:value{;prop2:value}#something2{someprop:val;prop:val}\n.something{property:v}alue;prop2:value}#something2{someprop:val;prop:val}"; 
preg_match_all($re, $str, $matches);
print_r($matches);

结果:

代码语言:javascript
复制
Array
(
    [0] => Array
        (
            [0] => {amdnia91(+wowa}
            [1] => 
.something{property:value;prop2:value}
            [2] => #something2{someprop:val;prop:val}
            [3] => #something2{someprop:val;prop:val}
            [4] => #something2{someprop:val;prop:val}
        )

    [1] => Array
        (
            [0] => amdnia91(+wowa
            [1] => property:value;prop2:value
            [2] => someprop:val;prop:val
            [3] => someprop:val;prop:val
            [4] => someprop:val;prop:val
        )

)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36691046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档