用正则表达式拆分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]