您好我正在使用Regex来有条理地省略java中的文本。
String pattern= "(#<omit_[a-zA-Z0-9_]+>)(.+?)(<omit_[a-zA-Z0-9_]+>)";
Mary had a #<omit_size>little <omit_size>lamb, his fleece was white as snow.
我的模式在上面的示例中工作正常,可以找到需要隐藏的内容。
当我可能需要隐藏某些可能需要隐藏的内容时,我的问题就出现了。 e.g:
Mary had a #<omit_segment> #<omit_size>little <omit_size>lamb, his <omit_segment> fleece was white as snow.
上述模式受到限制,因为它无法区分可能跟随'#<omit_'
的许多字符排列。因此,如果我只希望隐藏位于'#<omit_segment>... <omit_segment>'
我的模式之间的内容而不是'#<omit_segment> ...#<omit_size> '
,那么将打印出来:
Mary had a little <omit_size>lamb, his <omit_segment> fleece was white as snow.
而不是所需的:
Mary had a fleece was white as snow.
我意识到Regex可能不是这样的事情的答案,但在我撤消很多东西之前,我想我会看到是否可以挽救任何东西。所以..任何想法?
感谢。
答案 0 :(得分:1)
String pattern= "(#(<omit_[\\w_]+>))(.*[^#])(\\2)";
String pattern= "(#(<omit_[\\w_]+>))(.+)(?<!#)(\\2)";
\\2
与第二组匹配,即精确标记<...>
。
因此,如果标记名称在嵌套方面有所不同,则可能会起作用。
两个版本都检查结尾部分是否前面没有#
。
在第二种情况下具有负面的后观(匹配时长度为0)。
答案 1 :(得分:1)
你很幸运。使用后引用匹配正确的结束omit关键字。
(#<omit_(\\w+)>)(.+)(?<!#)(<omit_\\2>)