如何将数学运算符上的字符串拆分为分隔符,但在引号内转义运算符(在java中)?

时间:2014-11-22 06:15:01

标签: java regex

例如,

AM2 + 'G - D08 - 28 - 14 .xlsx]General Inputs' 应该拆分为

AM2'G - D08 - 28 - 14 .xlsx]General Inputs'

2 个答案:

答案 0 :(得分:1)

对于您给定输入示例的类型,我可能会匹配vs拆分。

String s  = "AM2 + 'G - D08 - 28 - 14 .xlsx]General Inputs'";
Pattern p = Pattern.compile("'[^']*'|[^ '+*/-]+");
Matcher m = p.matcher(s);
while (m.find()) {
  System.out.println(m.group());
}

输出

AM2
'G - D08 - 28 - 14 .xlsx]General Inputs'

答案 1 :(得分:1)

我认为你不能用split做到这一点 - 如果可以,那将是非常棘手和混乱的。 split擅长寻找分隔符,但是当一个模式必须应用于分隔符之间的东西时就不那么好了,在这种情况下就是这样。

相反,我会使用正则表达式来查找分隔符之间出现的文本,并使用Matcher方法。我看待这样的问题的方法是将非运算符文本视为一系列实体,其中每个实体都是

  • 带引号的字符串;
  • 不是引号的单个字符,并且不是运算符(或者运算符的开头,如果某些运算符是两个或更多字符)。

如果所有运算符都是一个字符,则找到“操作数”的正则表达式可能看起来像

('.*?'|[^'+\-*/])*

表示为任何不是+-*的单个字符在引号,之间查找任意数量的字符,或者/(请注意,-必须在角色类中进行转义)。最后*表示查找此模式的零个或多个。

要查找运算符可能是多个字符的情况,例如<<>>,您可以使用否定前瞻:

('.*?'|(?!\+|-|\*|/|<<|>>)[^'])*

表示在我们未查看+-*,{{1}的位置找到带引号的字符串或非引号字符},/<<,并发现此次零次或多次。

计划是使用>>和匹配器来查找操作数,然后使用lookingAt()查找运算符,然后前后移动。 (或者如果您根本不需要保留运算符,请使用@ {hwnd的答案中的lookingAt()。)

注意:我没有对此进行测试。我可能有一些细节错误,但这应该让您了解最佳方法。