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