Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字符串拆分,正则表达式忽略括号中的内容_Java_Regex - Fatal编程技术网

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

Java字符串拆分,正则表达式忽略括号中的内容,java,regex,Java,Regex,我想将字符串如“word1和word2或(word3和(word4或word5))和word6“与”和“仅从括号外分开,以获得:“word1”word2或(word3和(word4或word5))“word6” 请注意,一组括号可以包含许多其他括号 我做了一些研究,发现了一个正则表达式,它的作用与我想要的相反:(?:[^和(].\([^)]*\)+这个正则表达式选择括号外的“和”之外的所有东西。我也尝试过向前看和向后看,但都没有成功 有没有办法用正则表达式实现我的要求 感谢您提供Pattern.

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

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

我做了一些研究,发现了一个正则表达式,它的作用与我想要的相反:
(?:[^和(].\([^)]*\)+
这个正则表达式选择括号外的“和”之外的所有东西。我也尝试过向前看和向后看,但都没有成功

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


感谢您提供Pattern.Compile方法。您可以使用Pattern.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());         
    } 
}
}

请尝试此操作。

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

  • 迭代字符串以查找无法从中删除
    的范围。创建用于计算嵌套级别的变量。查找
    时增加此级别(
    并在查找
    时降低此级别)
    • 如果您找到
      并将级别从
      0
      更改为
      1
      ,则它是范围的开始
    • 如果您找到
      并将级别从
      1
      更改为
      0
      ,则该级别为范围结束
  • 在字符串中找到
    的位置(
    indexOf(data,fromIndex)
    在这里很有用),并检查它是否超出了不应拆分的范围
  • 当您拥有所有位置时,您应该在创建子字符串时从
    start、position
    进行拆分,并将next
    start
    更新为
    positoon+“and”.length()
    之后。在这之后,尝试下一部分的子串
  • 在第三点之后,你应该拥有你感兴趣的所有零件


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

    类解析器{
    私有静态类范围{
    私有int开始,结束;
    公共范围(整数开始、整数结束){
    this.start=start;
    this.end=end;
    }
    布尔isInside(int i){
    
    return start如果您想递归地执行此操作,我认为这是不可能的,因为这意味着您必须为每个表达式找到正确的右括号,但正则表达式不能表示这些括号。拆分
    word1和((word2和word3)和word4)以及word5的结果应该是
    word1
    ((word2和word3)和word4)
    word5
    ,或者你想把中间的单词拆分成
    ((word2和word3)
    word4)
    ?我问这个问题是因为你接受的答案也是中间部分。我想得到第一个命题:“word1”“((word2和word3)和word4)”“word5”正则表达式不是解析的通用工具。它只解析正则语法(加上一些扩展)。如果我没记错的话,匹配的括号是上下文无关的。它必须是正则表达式吗?常规字符串操作可以做到这一点。这个正则表达式不起作用不是因为点,因为它们在这里都没有使用,而是因为嵌套的
    (..)
    有问题。请在
    “word1和((word2或word3)和word4)以及word5”处尝试
    了解我的意思。@PramondPP
    模式。DOTALL
    只使点(.)匹配行终止符,这与问题无关,它们甚至不会出现在正则表达式中。@beetix和PramondPP使用[^and]表示“除A、N或D以外的任何字符”,而不是“除and以外的任何单词”或者类似的东西。非常感谢,做得很好!我想我有点大胆地想用正则表达式来做这件事…我已经有了一些使用正则表达式的代码,我不想将其与字符串操作混合在一起。但是这很好!我对代码做了一点修改,因为它不适用于:“(word1或word6)和((word2和word3)以及word4)word5“这里是我所更改的:
    for(Range r:ranges){if(I>=r.getStart())return!r.isInside(I);}
    To:
    for(Range r:ranges){if(r.isInside(I)){return false;}
    很抱歉,我在写这篇评论时遇到了一些麻烦^^我怎么会错过了呢?谢谢,我将相应地更新我的答案:)
    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);