具有内括号的cos/sin/tan的正则表达式

您所在的位置:网站首页 cos的表达式 具有内括号的cos/sin/tan的正则表达式

具有内括号的cos/sin/tan的正则表达式

2024-07-06 23:35| 来源: 网络整理| 查看: 265

我建议一个接受要解析的字符串的方法,一个开始平衡符号之前的字符串,一个字符分隔符和一个包含或排除分隔符(标记)的标志。

见演示

代码语言:javascript复制public static List getBalancedStr(String s, String strBefore, Character markStart, Character markEnd, Boolean includeMarkers) { Matcher m = Pattern.compile("(?=(\\b\\Q" + strBefore + markStart.toString() + "\\E.*))").matcher(s); List subTreeList = new ArrayList(); while (m.find()) { int level = 0; int lastOpenBracket = -1; for (int i = 0; i < m.group(1).length(); i++) { char c = m.group(1).charAt(i); if (c == markStart) { level++; if (level == 1) { lastOpenBracket = (includeMarkers ? i : i + 1); } } else if (c == markEnd) { if (level == 1) { if (includeMarkers) { subTreeList.add(strBefore + m.group(1).substring(lastOpenBracket, i + 1)); } else { subTreeList.add(m.group(1).substring(lastOpenBracket, i)); } break; } level--; } } } return subTreeList; }

样本使用情况:

代码语言:javascript复制String s = "2*-5+ sin(1.5*4)+(28- 3^4-(cos(3+(19*3)+1+(6/2))/2+tan(1+cos(1+9))-6/3+2.3*3.3345)+1)+1)-(4/2)"; System.out.println("cos: " + getBalancedStr(s, "cos", '(', ')', true)); // cos: [cos(3+(19*3)+1+(6/2)), cos(1+9)] System.out.println("sin: " + getBalancedStr(s, "sin", '(', ')', true)); // sin: [sin(1.5*4)] System.out.println("tan: " + getBalancedStr(s, "tan", '(', ')', true)); // tan: [tan(1+cos(1+9))]

注意,该方法编译了一个regex - "(?=(\\b\\Q" + strBefore + markStart.toString() + "\\E.*))" --它将只匹配cos或sin作为一个整体单词(因为\b是一个单词边界),并且.*将匹配到行尾。如果要支持多行输入,请在前面使用(?s):"(?s)\\b\\Q" + strBefore + markStart.toString() + "\\E.*"。由于模式在一个未锚定的正前瞻中的捕获组中,所以我们收集所有重叠的匹配,并且在每个匹配中只获得一个平衡子字符串(因为在找到了相应的匹配结束分隔符之后,我们就脱离了for循环。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3