当前位置: 首页 > 知识库问答 >
问题:

正则表达式不在括号中

东门城
2023-03-14

我需要通过不在括号中的管道拆分文本。这是示例文本

I {need|want|{ask|prefer}} you to {help {Jason|Maria|Santa|{Lucia|Raul}'s father}|go to school} 

我在这里找到了这个/\ |(?![^{]*})/g:regex,提取字符串,不要在两个括号之间

现在当我想用管子分割这部分字符串时

help {Jason|Maria|Santa|{Lucia|Raul}'s father}|go to school 

它还选择杰森、玛丽亚和圣诞老人之间的管道,因为它们后面有一个开口支架。如果正则表达式不在任何括号中,如何将其更改为仅匹配管道。

测试字符串:

help {Jason|Maria|Santa|{Lucia|Raul}'s father}|go to school

应该返回

help {Jason|Maria|Santa|{Lucia|Raul}'s father}
go to school

.

Jason|Maria|Santa|{Lucia|Raul}'s father

应该返回

Jason
Maria
Santa
{Lucia|Raul}'s father

共有1个答案

程胡非
2023-03-14

您可以使用SKIP-FAIL正则表达式:

'~(\{(?:[^{}]++|(?1))*})(*SKIP)(*F)|\|~'

查看正则表达式演示

细节

  • (\{(?:[^{}] |(? 1))*})(*SKIP)(*F)-匹配平衡花括号之间的子字符串并跳过此匹配
    • (\{(?:[^{}] |(? 1))*})-捕获组1匹配的{,然后重复0次除{}之外的1个字符,或者递归整个组1模式(?1)是正则表达式子例程),然后}(平衡花括号子字符串)
    • (*SKIP)(*F)-使正则表达式引擎匹配失败并跳过匹配文本以从匹配端继续匹配的PCRE动词

    PHP演示:

    $re = '~(\{(?:[^{}]++|(?1))*})(*SKIP)(*F)|\|~';
    $str = "Jason|Maria|Santa|{Lucia|Raul}'s father";
    print_r( preg_split($re, $str) );
    

    输出:

    Array
    (
        [0] => Jason
        [1] => Maria
        [2] => Santa
        [3] => {Lucia|Raul}'s father
    )
    

 类似资料:
  • 问题内容: 我有类似的东西 商店 结束行像1商店..我想匹配,它使用python正则表达式。 我尝试了类似的方法, 但是没有用。 编辑:添加代码,我试过 请帮助。 谢谢吉乔 问题答案: 或多或少直接回复您的评论 尝试这个 解决方案是使用,而不是使用后者,因为后者试图将整个字符串与regexp匹配,而前者只是试图在字符串内部查找与表达式匹配的子字符串。

  • 问题内容: 匹配字符串中的’(’的正则表达式是什么? 以下是场景: 我有一串 我想使用正则表达式拆分字符串。为此,我正在使用 但是我收到以下异常。 转义似乎不起作用。 问题答案: 两种选择: 首先,你可以使用转义 回 斜线- 另外,由于它是单个字符,因此您可以将其放入不需要转义的字符类中-

  • 我试图匹配以下模式: 在这里,我使用以下正则表达式来匹配上述模式: 然而,我的模式不起作用。

  • 问题内容: 我一直试图在Java中编写一个正则表达式以删除下面括号中的所有内容,同时保留其他所有内容。 注意,括号可以嵌套,这就是为什么我的模式失败的原因 。有人能帮我吗?下面我试过了: 但这打印: d4 Nf6 2. c4 g6 3. Nc3 Bg7 4. e4 d6 5. Nf3 OO 6. Be2 e5 7. dxe5 dxe5 8. Qxd8 Rxd8 9. Bg5 Nbd7 10. OO

  • 问题内容: 当我使用某种方式时,它仍然会触发,好像连字符无效。我试着和 问题答案: 转义使用应该没问题,但是您也可以尝试将其放在字符类的开头或结尾。这应该为您工作:

  • 本文向大家介绍使用JS正则表达式 替换括号,尖括号等,包括了使用JS正则表达式 替换括号,尖括号等的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇使用JS正则表达式 替换括号,尖括号等就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。