ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
任何人都可以帮助完成我的正则表达式吗? 我的字符串格式如下: ~~~ <FC012D>{p:19}Ja?<BF093C> Du möchtest<BC>zur Königin?<BC><BF040027><BF07>{p:20}<F8012D>Hmm...<BF093C><BC>Du bist gekommen um den<BC>Titel Kriegerin<BC>zu erhalten?<BD><BC>Verstehe.<BF093C> Das ist ganz<BC>schön tapfer für so<BC>eine junge Dame.<BD><BC>Die Königin wird sicher<BC>auch sehr<BC>überrascht sein.<BD><BC>{t:19}Bitte sehr,<BC>geh direkt hinein.<BD><FF>{t:20}Treibe Dich hier nicht<BC>herum, wenn Du hier<BC>nichts zu suchen hast!<BD><FF> ~~~ 我需要使用 preg\_match\_all 将它们拆分成一个数组以获得 3 种类型的数组元素: * 带 <> 的字符串 * 带有 {} 的字符串* 作为单独元素的其他两个选项之间的任何其他内容。 这是我目前所拥有的: ~~~ preg_match_all("/<[^>]*>|{(.*?)}|(\(.*?)\)/", $input_lines, $output_array); ~~~ 我需要最后一个选项的帮助,即捕获介于两者之间的字符串。[http://www.phpliveregex.com/p/kdW](http://www.phpliveregex.com/p/kdW) **最佳答案** 使用[`preg_split`](http://www.php.net/preg_split)与`PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY`标志和以下正则表达式: ~~~ '~(<[^<>]*>|{[^{}]*})~' ~~~ 参见[regex demo](https://regex101.com/r/WmIh5r/1).它匹配并将两种类型的子字符串捕获到组 1 中: * `<[^<>]*>`\-`<`后跟除`<`以外的 0+ 个字符和`>`然后`>` * `{[^{}]*}`\-`{`后跟除`{`以外的 0+ 个字符和`}`然后`}` `PREG_SPLIT_DELIM_CAPTURE`将所有匹配项包含到结果数组中。`PREG_SPLIT_NO_EMPTY`将删除不必要的空元素。 参见[PHP demo](https://ideone.com/7BxY4X): ~~~ $s = '<FC012D>{p:19}Ja?<BF093C> Du möchtest<BC>zur Königin?<BC><BF040027><BF07>{p:20}<F8012D>Hmm...<BF093C><BC>Du bist gekommen um den<BC>Titel Kriegerin<BC>zu erhalten?<BD><BC>Verstehe.<BF093C> Das ist ganz<BC>schön tapfer für so<BC>eine junge Dame.<BD><BC>Die Königin wird sicher<BC>auch sehr<BC>überrascht sein.<BD><BC>{t:19}Bitte sehr,<BC>geh direkt hinein.<BD><FF>{t:20}Treibe Dich hier nicht<BC>herum, wenn Du hier<BC>nichts zu suchen hast!<BD><FF>'; $res = preg_split('~(<[^<>]*>|{[^{}]*})~', $s, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); print_r($res); ~~~