Java正则表达式拆分CFG字符串问题求助
解决CFG字符串按非终结符拆分的正则问题
我明白你遇到的问题了——你想把CFG格式的字符串里的非终结符(<xxx>)和普通文本拆分开,但当前用的正则只在<前面分割,导致非终结符后面的文本被粘在了一起。让我来帮你搞定这个!
问题根源
你用的str.split("(?=<)")是正向零宽断言,只会在<符号的前面位置进行分割,所以<animal>后面的 loves to会和<animal>被分到同一个元素里,达不到你想要的拆分效果。
解决方案
我们需要同时在两个位置分割:<的前面,以及>的后面。可以用同时包含正向和反向零宽断言的正则表达式:
String str = "The <animal> loves to <activity>."; String[] result = str.split("(?=<)|(?<=>)");
运行结果
执行这段代码后,result数组的内容就是你期望的:
"The ""<animal>"" loves to ""<activity>""."
正则表达式解释
让我们拆解一下这个正则(?=<)|(?<=>):
(?=<):正向零宽断言,匹配一个位置,这个位置的后面紧跟<,在这个位置分割(?<=>):反向零宽断言,匹配一个位置,这个位置的前面是>,在这个位置分割|:逻辑或,意味着只要满足其中一个条件就进行分割
额外提示
如果你的非终结符是严格的<xxx>格式(没有嵌套的<>),这个正则完全够用。如果遇到嵌套场景,可能需要更复杂的正则处理,但针对你当前的需求,这个方案完美适配。
内容的提问来源于stack exchange,提问作者Cybergenik
相关产品推荐
相关产品推荐

