我想拆开这条线:
=IF(BI18=0;INT(YEAR(TODAY()));IF(INT(YEAR(BI18))>2025;2025;INT(YEAR(BI18))))
[IF, BI18=0, INTYEARTODAY, IF, INTYEARBI18>2025, 2025, INTYEARBI18]我试过用那个正则表达式:
String[] result = text.substring(1, text.length()).split("[;()]+");
然而,我得到的是:
[IF, BI18=0, INT, YEAR, TODAY, IF, INT, YEAR, BI18, >2025, 2025, INT, YEAR, BI18]
我正努力从总体上识别excel方法。
我很感激你的回答,按预期一般地拆分字符串。
发布于 2014-06-18 09:36:27
后续的注释,如果您想要的主要内容的IF(...)条件,其中的...是内容,这里有一个快速解决方案。
请注意,尽管此解决方案适用于手头的输入,但在其他情况下,使用嵌套语句可能是不可靠的--基本上是一个解决方案。
String formula = "=IF(BI18=0;INT(YEAR(TODAY()));IF(INT(YEAR(BI18))>2025;2025;INT(YEAR(BI18))))";
// | positive lookbehind: starts with "IF("
// | | any character, reluctantly quantified
// | | | positive lookahead, followed by
// | | | ")", then...
// | | | | ";" or end of input
// | | | |
Pattern p = Pattern.compile("(?<=IF\\().+?(?=\\)(;|$))");
Matcher m = p.matcher(formula);
while (m.find()) {
System.out.println(m.group());
}输出
BI18=0;INT(YEAR(TODAY())
INT(YEAR(BI18))>2025;2025;INT(YEAR(BI18)))发布于 2014-06-18 09:35:43
你可以用这个正则表达式。在演示中,确保查看右边的捕获组。
^=([^(]+)\(|\G([^;]+)[;|)$]我们从捕获组1和2中检索匹配。
在Java中,这意味着如下所示:
Pattern regex = Pattern.compile("^=([^(]+)\\(|\\G([^;]+)[;|)$]");
Matcher regexMatcher = regex.matcher(your_original_string);
while (regexMatcher.find()) {
// check Group 1, which is regexMatcher.group(1)
// check Group 2, which is regexMatcher.group(2)
}发布于 2014-06-18 09:44:52
试试看
String str1 = "=IF(BI18=0;INT(YEAR(TODAY()));IF(INT(YEAR(BI18))>2025;2025;INT(YEAR(BI18))))";
ArrayList<String> strList = new ArrayList<String>();
for(String str2 : str1.replaceFirst("=", "").split(";")){
if(str2.contains("IF")){
strList.add("IF");
strList.add(str2.replaceAll("IF|\\(|\\)", ""));
}else{
strList.add(str2.replaceAll("\\(|\\)", ""));
}
}
System.out.println(strList.toString());输出:
[IF, BI18=0, INTYEARTODAY, IF, INTYEARBI18>2025, 2025, INTYEARBI18]https://stackoverflow.com/questions/24281789
复制相似问题