Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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,比如说, AM2+'G-D08-28-14.xlsx]通用输入' 应拆分为 AM2和'G-D08-28-14.xlsx]常规输入“对于给定的输入类型示例,我可能会匹配vs拆分 String s = "AM2 + 'G - D08 - 28 - 14 .xlsx]General Inputs'"; Pattern p = Pattern.compile("'[^']*'|[^ '+*/-]+"); Matcher m = p.matcher(s); while (m.find()) { Sy

比如说,

AM2+'G-D08-28-14.xlsx]通用输入'
应拆分为


AM2
'G-D08-28-14.xlsx]常规输入“

对于给定的输入类型示例,我可能会匹配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
善于查找分隔符,但当模式必须应用于分隔符之间的内容时,就不太好了,在本例中,它会这样做

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

  • 带引号的字符串
  • 不是引号且不是运算符的单个字符(如果某些运算符是两个或多个字符,则为运算符的开头)
如果所有运算符都是一个字符,则查找“操作数”的正则表达式可能如下所示

('.*?'|[^'+\-*/])*
表示在引号之间查找任意数量的字符,或者查找不是
+
-
*
/
的任何单个字符(请注意,
-
必须在字符类中转义)。最后一个
*
表示查找此模式的零个或多个

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

('.*?'|(?!\+|-|\*|/|<<|>>)[^'])*
('.'.'|(?!\+\124;-\*\ 124;/)[^']))*
这意味着在我们没有查看
+
-
*
/
/
,的点上查找带引号的字符串或非引号的字符,并查找零次或多次

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

注意:我没有测试过这个。我可能有一些细节有误,但这应该会让你知道最好的方法。

(+1)很好的详细答案。您可以将前瞻更改为使用字符类
(?![+/*-]|)