我想使用数字作为分隔符来分隔Java中的字符串,但保留数字。一些研究表明,使用String中的split方法()会很合适,但我不明白如何去做。为了进一步说明我的问题,我会用一个例子:在Java中分割字符串:可变长度的lookahead和lookbehead
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"]
并通过回顾后我得到一个异常:
线程“main”中的异常java.util.regex.PatternSyntaxException: Look-behind组在索引 附近没有明显的最大长度22(? < =([0-9] +([0-9] +)?))
任何人都可以解释我这种行为,并提出一个解决办法? PS:我知道我可以使用'|'打破字符串,但是这仅仅是一个愚蠢的例子,其实我需要一个更复杂的正则表达式...
编辑:
似乎是不可能做我想做什么,因为长度的分隔符。因为我正在寻找解决方案来解决一个较小的问题,我可以用它来练习其余的练习,我将重新翻译一下,看看是否有转机,就像第二个和第三个答案中找到的那样:
I想要打破包含算术表达式的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());
要重新说明您的问题,是否正确地说要查找字符串中的所有数字?如果是这样,为什么不做一个正则表达式来查找数字而不是使用'split'? – MadConan
不知道我是否理解你的问题......我需要用Java来完成。有没有另外一种方法在Java中使用正则表达式来完成它? – rsy
使用'split'通常意味着你需要分隔符之间的东西。你可以做你正在问的问题,但我会用'Matcher'和'Matcher.find()'来获取数字。也许不是说这更好,更多“正常”。 – MadConan