如何将数学运算符上的字符串拆分为分隔符,而将转义运算符拆分为引号(在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)很好的详细答案。您可以将前瞻更改为使用字符类(?![+/*-]|)