Java 正则表达式只匹配前缀或后缀(XOR)
我有一个模式,我将其称为Java 正则表达式只匹配前缀或后缀(XOR),java,regex,Java,Regex,我有一个模式,我将其称为Z(实际模式有点长,对问题不重要)。简单地说,我希望能够匹配\*\sZ或Z\:,但不能两者都匹配,也不能两者都匹配 我尝试使用lookaheads(类似于下面),但是由于前缀和后缀之间的模式,它们无法工作 (\*\s(?!\:))Z((?<!\*)\:) (\*\s(?!\:)Z(? 是否有一种不必复制模式(例如,(\*\sZ|Z\:))就可以实现这一点 关于我的模式的一个简要说明是,在Z模式中没有\*,只有在前缀中。相反,在Z模式中也没有\:,如果立即执行Z,它
Z
(实际模式有点长,对问题不重要)。简单地说,我希望能够匹配\*\sZ
或Z\:
,但不能两者都匹配,也不能两者都匹配
我尝试使用lookaheads(类似于下面),但是由于前缀和后缀之间的模式,它们无法工作
(\*\s(?!\:))Z((?<!\*)\:)
(\*\s(?!\:)Z(?
是否有一种不必复制模式(例如,(\*\sZ|Z\:)
)就可以实现这一点
关于我的模式的一个简要说明是,在Z
模式中没有\*
,只有在前缀中。相反,在Z模式中也没有\:
,如果立即执行Z,它只在后缀中,而不在任何其他字符之后(后缀后面有一个*
捕获)
有没有一种方法可以实现这一点而不必复制
模式
答案是“否”。这与正则表达式的基本属性和和或不同。在正则表达式中,您可以通过使用串联来轻松构造和表达式,并分别使用和来构造或表达式
但是无论如何,如果你仍然想完成你的工作,我建议你这样做
首先,这里已经有了两种模式
\*\sZ
及
所以,正如你所说,这两种模式不可能同时发生
因此,从xor
的属性来看:
A异或B=(A&~B)|(~A&B)
最后,我们可以
\*\sZ(?!\:)|(?<!\*\s)Z\:
\*\sZ(?!\:)|(?
查看一个您使用的是哪种语言?@ndnJava,尽管为了简单起见,我一直在使用一个在线的pcre
测试仪。我认为在java中没有一种方法只使用正则表达式就可以做到这一点。在单独的字符串中提取Z
,并使用它来创建整个模式,这样您就不必重复它。尝试((?:^\b)pre)\S+\S+\suf(?:\b |$)
,其中pre=prefix和suf=suffix。它将捕获具有给定前缀或后缀的所有单词。这是怎么回事?尽管OP说了其中一个或另一个,但他的意思只是简单的。
。他只是想知道如何不复制Z
。他说“有没有一种方法可以在不复制模式的情况下实现这一点?”答案是“不”,因为XOR
不是正则表达式的基本构造块。我已经回答了“不”,并建议他按照他说的做:“我希望能够匹配\*\sZ
,或Z\:
,但不是两者都匹配,也不是两者都匹配。”在我的回答中,我给了他一个正则表达式。现在我接受了,我很确定这是真的,但我希望在正则表达式中有一些我不知道的魔力。我只是用一个变量来保持这个模式,并以这种方式进行处理。
\*\sZ(?!\:)|(?<!\*\s)Z\: