我想使用数字作为分隔符来破坏 Java 中的字符串,但保留数字。一些研究表明,使用 String 中的 split method() 是合适的,但我不明白如何做到这一点。为了进一步解释我的问题,我将使用一个例子:
Input: 20.55|50|0.5|20|20.55
Required Output: ["20.55","|","50","|","0.5","|","20","|","20.55"]
通过调用 split 方法(如下面的示例所示),无需前向和后向,我得到了预期的输出
expression.split("([0-9]+(\\.[0-9]+)?)")
Output: ["|","|","|","|"]
但如果我尝试通过前瞻来做到这一点:
expression.split("(?=([0-9]+(\\.[0-9]+)?))")
Output: ["2","0.","5","5|","5","0|","0.","5|","2","0|","2","0.","5","5"]
通过使用lookbehind,我得到一个异常:
线程“main”中的异常java.util.regex.PatternSyntaxException:
后视组在索引附近没有明显的最大长度
22 (?
谁能向我解释这种行为并提出解决方案?
PS:我知道我可以使用“|”打破字符串,但这只是一个愚蠢的例子,我实际上需要一个更复杂的正则表达式......
EDIT:
由于分隔符的长度,似乎不可能做我想做的事。由于我正在寻找一个较小问题的解决方案,然后我可以将其用于练习的其余部分,因此我将重新措辞以查看是否有转机,就像第二个和第三个答案中发现的那样:
我想在Java中打破一个包含算术表达式的字符串,并保留它的所有项目。例如:
Input: 20.55 * 0.5 ** cos(360) + sin 0 * cos 90 + 1 * sin (180 + 90) * 0
Output: ["20.55", "*", "0.5", "**", "cos", "(", "360", ")", "+", "sin", "0", "*", "cos", "90", "+", "1", "*", "sin", "(", "180", "+", "90", ")", "*", "0"]
PSS:请注意,我必须使用“**”来求幂。
EDIT 2根据anubhava给出的答案,找到了一个解决方案,可以打破其所有项目的算术表达式
Pattern p = Pattern.compile( "\\*\\*|sin|cos|tan|\\d+(?:\\.\\d+)?|[-()+*/%]" );
Matcher matcher = p.matcher(expression);
while(matcher.find())
System.out.println(matcher.group());