繁体   English   中英

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

[英]How to Split a String on mathematical operators as delimiters but escape operators inside quotes (in java)?

例如,

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

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

对于给定输入示例的类型,我可能会匹配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'

我认为您无法使用split进行此操作-如果可以的话,这将非常棘手且混乱。 split擅长查找定界符,但是当必须将模式应用于定界符之间的内容时, split不太好,在这种情况下会很合适。

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

  • 带引号的字符串;
  • 不是引号,也不是运算符的单个字符(如果某些运算符是两个或多个字符,则不是运算符的开始)。

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

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

这表示要在引号之间查找任意数量的字符, 或者查找不是+-*/任何单个字符(请注意-必须在字符类内转义)。 最后一个*表示寻找零个或多个该模式。

要查找一个运算符可能是多个字符(例如<<>> ,可以使用负向超前:

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

这意味着在我们不查看+-*/<<>>的点上找到带引号的字符串或非引号字符,并找到零次或多次。

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

注意:我尚未测试。 我可能有一些细节错误,但这应该使您对最佳方法有所了解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM