Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式只匹配前缀或后缀(XOR)_Java_Regex - Fatal编程技术网

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\: