Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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,我正在尝试拆分一个表示为字符串的算术方程,我希望保留多字符分隔符:{==,!=,>=,和在和中添加负数look aheads(?!=),以确保它们在=是运算符的一部分时不匹配: String[] parsedExpression = expression.split("((?<===)|(?===)|" + "(?<=>=)|(?=>=)|" + "(?<=!=)|(?=!=)|" + "(?<=<=)|(

我正在尝试拆分一个表示为字符串的算术方程,我希望保留多字符分隔符:
{==,!=,>=,
中添加负数look aheads
(?!=)
,以确保它们在
=
是运算符的一部分时不匹配:

String[] parsedExpression = expression.split("((?<===)|(?===)|"
        + "(?<=>=)|(?=>=)|"
        + "(?<=!=)|(?=!=)|"
        + "(?<=<=)|(?=<=)|"
        + "(?<=>(?!=))|(?=>(?!=))|"   // See here
        + "(?<=<(?!=))|(?=<(?!=)))"); // and here
String[]parsedExpression=expression.split((?=)|”

+(?表达式中是否只能有一个标记(“>”、“>=”、“==”,等等)?是否允许类似“5<6<7”的内容

虽然它不使用正则表达式,但您可以尝试这样的方法

String[] parsedExpression = new String[3]; // assuming form "3 < 4". may need to modify a little
String[] tokens = {"==", "!=", "<", ">", "<=", ">="};

int idxOfToken = expression.indexOf(try every token until one is present);
String comparOp = ""; // set to operator you found
int additional = comparOp.length() == 2 ? 2 : 1;

parsedExpression[0] = expression.substring(0, idxOfToken);
parsedExpression[1] = comparOp;
parsedExpression[2] = expression.substring(idxOfToken + additional);
String[]parsedExpression=新字符串[3];//假设格式为“3<4”。可能需要修改一些
字符串[]标记={“==”,“!=”,“”,“=”};
int idxOfToken=expression.indexOf(尝试每个标记,直到有一个标记为止);
字符串comparOp=”“;//设置为找到的运算符
int additional=comparOp.length()==2?2:1;
parsedExpression[0]=表达式.子字符串(0,idxOfToken);
parsedExpression[1]=比较;
parsedExpression[2]=表达式.substring(idxOfToken+additional);

因为您正在拆分宽度为零的lookarounds,即使最初匹配两个字符的模式,匹配位置也不会超过整个模式。相反,您可以匹配模式的另一部分

因此,即使最初匹配:
=
,其中的
=
也会再次匹配

虽然使用lookarounds拆分可以解决您的问题,但它会将难以理解的正则表达式弄得一团糟。采用不同的方法会更好、更简单

例如,您可以匹配分隔符或非分隔符:

/[^><=]+|[><=]+/

/[^>更新1:第四种模式工作不正常


您只想在这些之前和之后进行拆分:
=
!=
=
我不知道regex,但您可以手动执行吗?您可以循环直到找到令牌或令牌的一部分(“>”)然后检查下一个。如果是“=”您的拆分令牌是“>=”,否则它是“>”。非常感谢,这大大简化了我的尝试。谢谢,这清楚了如何使用我的方法解决它。谢谢你的答案!谢谢你的答案,我喜欢以不同的方式处理它。我也会仔细看看!
String[] parsedExpression = expression.split("((?<===)|(?===)|"
        + "(?<=>=)|(?=>=)|"
        + "(?<=!=)|(?=!=)|"
        + "(?<=<=)|(?=<=)|"
        + "(?<=>(?!=))|(?=>(?!=))|"   // See here
        + "(?<=<(?!=))|(?=<(?!=)))"); // and here
String[] parsedExpression = new String[3]; // assuming form "3 < 4". may need to modify a little
String[] tokens = {"==", "!=", "<", ">", "<=", ">="};

int idxOfToken = expression.indexOf(try every token until one is present);
String comparOp = ""; // set to operator you found
int additional = comparOp.length() == 2 ? 2 : 1;

parsedExpression[0] = expression.substring(0, idxOfToken);
parsedExpression[1] = comparOp;
parsedExpression[2] = expression.substring(idxOfToken + additional);
/[^><=]+|[><=]+/
(?=[=!]=|[><])|(?<=[=!><]=|[><](?!=))
String regex = "(?=[=!]=|[><])|(?<=[=!><]=|[><](?!=))";
String[] split = "2*(5+1)-3*2 >= 6^3.1+5".split(regex);
System.out.println(Arrays.toString(split));

split = "a == b != c >= d <= e > f < g = h ! i".split(regex);
System.out.println(Arrays.toString(split));
[2*(5+1)-3*2 , >=,  6^3.1+5]
[a , ==,  b , !=,  c , >=,  d , <=,  e , >,  f , <,  g = h ! i]
String text = "2*(5+1)-3*2 >= 6^3.1+5";
Matcher m = Pattern.compile("[=!]=|[><]=?").matcher(text);
if (m.find()) {
    String left  = text.substring(0, m.start());
    String oper  = m.group(); // or text.substring(m.start(), m.end());
    String right = text.substring(m.end());
    System.out.printf("[%s, %s, %s]%n", left, oper, right);
}
[2*(5+1)-3*2 , >=,  6^3.1+5]