繁体   English   中英

Java正则表达式取反与边界(方括号)

[英]java regex negate with boundaries (square bracktes)

如果有人可以帮助我解决JAVA regex要求,我将得到一个类似于"/ABC/KLM[XYZ/ABC/KLM]/ABC"的字符串。

我想用方括号替换所有包围的ABC。 在这种情况下,只能找到第一个和最后一个ABC。 但中间没有ABC,因为它被方括号包围

如果没有递归正则表达式,则无法执行此操作。 Java在标准库中不支持此功能,但是在Perl或.NET中可以找到正则表达式。 从本质上讲,这与尝试在HTML标签中匹配内容是相同的问题-到目前为止,最简单的方法是使用基于堆栈的解析器

解决方案在这里:

  public class MergeParentAndChildXPATH { public static void main(String[] args) { String substringToBeFound = "ABC"; String toReplayceWith = "XXX"; String xPathFromExcel = "/UTILMD/ABC/[XYZ/ABC/KLM]KLM[XYZ/ABC/[XYZ/ABC/KLM]KLM]/ABC"; System.out.println("original String\\t"+xPathFromExcel); String manupulatedString = mergeParentAndChildXPATH(substringToBeFound, toReplayceWith,xPathFromExcel); System.out.println("manipulated String\\t"+manupulatedString); } public static String mergeParentAndChildXPATH(String substringToBeFound, String toReplayceWith, String xPathFromExcel ) { StringBuffer sbManipulatedString = new StringBuffer(); int lengthABC = substringToBeFound.length(); CharStack charStack = new CharStack(); String substringAfterMatch = ""; while (xPathFromExcel.indexOf(substringToBeFound)>-1) { int matchStartsAt = xPathFromExcel.indexOf(substringToBeFound); int matchEndssAt = xPathFromExcel.indexOf(substringToBeFound)+lengthABC; String substringBeforeMatch = xPathFromExcel.substring(0, matchStartsAt); substringAfterMatch = xPathFromExcel.substring(matchStartsAt+lengthABC); String substringMatch = xPathFromExcel.substring(matchStartsAt, matchEndssAt); // System.out.println("Loop Count\\t"+loopCount); // System.out.println("substringBeforeMatch\\t"+substringBeforeMatch); // System.out.println("substringAfterMatch\\t"+substringAfterMatch); // System.out.println("starts "+matchStartsAt+ " ends "+matchEndssAt); // System.out.println("Output of match: "+substringMatch); // now tokenize the string till match is reached and memorize brackets via Stack String sTokenize = xPathFromExcel; for (int i = 0; i < matchStartsAt; i++) { char ch = sTokenize.charAt(0); // System.out.println(ch); // System.out.println(sTokenize.substring(0,1)); if (ch == '[') { charStack.push(ch); } if (ch == ']') { charStack.pop(); } sTokenize = sTokenize.substring(1); }//for if (charStack.empty()) { substringMatch = substringMatch.replaceAll(substringMatch, toReplayceWith); } // sbManipulatedString.append(substringBeforeMatch + substringMatch); // System.out.println("manipulatedString\\t"+sbManipulatedString.toString()); xPathFromExcel = substringAfterMatch; // System.out.println("remaining String\\t"+substringAfterMatch); } return (sbManipulatedString.toString()+substringAfterMatch); } } import java.util.Stack; public class CharStack { private Stack theStack; CharStack() { theStack = new Stack(); } public char peek() { Character temp = (Character) theStack.peek(); return temp.charValue(); } public void push(char c) { theStack.push(new Character(c)); } public char pop() { char temp = (Character) theStack.pop(); return temp; } public boolean empty() { return theStack.empty(); } } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM