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

Java字符串拆分与正则表达式忽略括号中的内容

吴星汉
2023-03-14

我想将“word1和word2或(word3和(word4或word5))和word6”等字符串与“和”分开,以便从括号外获得:“word1”“word2或(word3和(word4或word5))”“word6”

请注意,括号组可以包含许多其他括号组。

我做了一些研究,我发现了一个正则表达式,它与我想要的相反:(?:[^AND(]|\([^)]*\)) 这个正则表达式选择括号之外的“AND”以外的所有内容。我还尝试了前瞻和后视,但没有成功。

有没有办法用正则表达式实现我的要求?

谢谢

共有2个答案

马安邦
2023-03-14

用于图案。可以使用模式的编译方法。DOTALL作为参数。给出了代码示例

import java.util.regex.*;
public class Test
{
public static void main(String[] args)
{
    String s="word1 AND word2 OR (word3 AND (word4 OR word5)) AND word6";

    String regEx="(?:[^AND(]|\\([^)]*\\))+";
     Pattern pattern = Pattern.compile(regEx, Pattern.DOTALL);
     Matcher matcher = pattern.matcher(s);         

     while (matcher.find()) {             
        System.out.println("Found the text \"" + matcher.group() + "\" starting at " + matcher.start() + " index and ending at index " + matcher.end());         
    } 
}
}

请试试这个。

劳昊明
2023-03-14

考虑为这个任务创建自己的解析器(没有那么复杂)。

  • 迭代字符串以查找无法从中删除的范围。创建用于计算嵌套级别的变量。当您找到时,请提高此级别(当您找到时,请降低此级别)
    • 如果您找到(,并将级别从0更改为1,则这是范围的开始
    • 如果您找到,并将级别从1更改为0,则表示范围结束

    在第3点之后,你应该拥有你感兴趣的所有零件。

    下面是解析器类的示例,它似乎在做您想要的事情。要看到它,请将鼠标悬停在上面。但在使用它之前,请尝试创建自己的实现。

    类解析器{私有静态类范围{私有int start,end;公共范围(int start,int end){this.start=start;this.end=end;}布尔isInside(int i){返回开始

    用法示例

    String data = "word1 AND ((word2 AND word3) AND word4) AND word5";
    Parser p = new Parser();
    for (String s : p.parse(data))
        System.out.println(s);
    

 类似资料:
  • 问题内容: 仅使用正则表达式方法,方法String.replaceAll和ArrayList如何将字符串拆分为标记,但忽略引号内存在的定界符?分隔符是非字母数字或带引号的文本的任何字符 例如:字符串: 你好^世界’这*有两个令牌’ 应该输出: 你好 worldthis *有两个令牌 问题答案: 使用a 来标识要保留的部分,而不是要拆分的部分: 看到它在线上工作:ideone

  • 上面的正则表达式返回括号之间的文本。 如: 如何重写上面的正则表达式,所以我提供了一个类似的字符串,它将返回。i、 e带括号的部分,其中包含大括号中的字符串。

  • 问题内容: 我的文字如下: 谁能告诉我我必须使用哪些正则表达式分度数才能获得以下结果: 我在这里阅读Sun教程,直到“ Matcher类的方法”为止,但我仍然茫然。谢谢! 如果是这样,那将很容易,但是不幸的是,事实并非如此。有任何想法吗? 问题答案: 您可以直接使用split()方法,如下所示: (请注意,这将返回长度为5的数组,第一个位置为空字符串) 或者,如果您想使用模式/匹配器,可以这样做:

  • 我收到了很多文件,其中我的控制为零,我需要根据分隔符进行拆分。但是当分隔符在引号内时,我不想拆分。因此,列 1、列 2、列 3 是 然而,column1、“column2”、column3是 这可以使用此正则表达式(在 C# 下) 现在,我的问题是当有一行只有一个双引号(仅打开或关闭)时,例如第1列,第2列",第3列返回 虽然它应该返回 我发现很多与正则表达式相关的,但在上面的特定示例中,它们都失

  • 问题内容: 我试图编写一个正则表达式,该表达式返回括号之间的字符串。例如:我想获取位于字符串“(”和“)”之间的字符串 会回来 找到正则表达式以获取Javascript中两个字符串之间的字符串,但是我对regex并不陌生。我不知道如何在正则表达式中使用’(’,’)’ 问题答案: 您需要创建一组转义的(带有)括号(与括号匹配)和一组常规的括号来创建捕获组: 分解: :匹配左括号 :开始捕获组 :匹配

  • 我有一个,其中包含2或3个公司名称,每个名称用括号括起来。每个公司名称也可以包含括号中的单词。我需要用正则表达式将它们分开,但没有找到方法。 我的输入代码: 预期结果是: 我的代码: 这适用于和,但不适用于。 当前结果: