2016-03-05 99 views
3

我有一個模式,我將其稱爲Z(實際模式有點長並且對問題不重要)。簡而言之,我希望能夠匹配\*\sZZ\:,但不是兩者都不匹配。正則表達式僅匹配前綴或僅匹配後綴(XOR)

我試圖使用lookaheads(類似於下面),但是由於前綴和後綴之間的模式,它們不起作用。

(\*\s(?!\:))Z((?<!\*)\:) 

是否有完成此無需複製的圖案(例如(\*\sZ|Z\:))的方法嗎?

有關我的模式的快速註釋是Z模式中沒有\*,僅在前綴中。相反還有還有在Z模式沒有\:,它只是在後綴如果立即着手 Z,但不經過任何其它字符(有後綴後.*捕獲)

+0

哪種語言您使用的看到了嗎? – ndn

+1

@ndn java,儘管爲了簡單起見,我一直使用在線'pcre'測試程序。 – Rogue

+1

我不認爲有一種方法只在java中使用正則表達式。在單獨的字符串中提取'Z'並使用它來創建整體模式,因此您不必複製它。 – ndn

回答

3

有沒有實現這一點的一種方式而不必重複 模式?

答案是「否」。不像andor這是正則表達式的基本屬性。在正則表達式中,可以分別使用concatenationor表達式分別使用|來輕鬆構建and表達式。

但無論如何,如果你仍然想完成你的工作,我建議你這樣做。

首先,你已經在這裏度過了

\*\sZ 

Z\: 

所以兩種模式,如你所說,不能在同一時間發生的這兩種模式。

xor性質

所以:

A XOR B =(A &〜B)|(〜甲& B)。

最後,我們可以得到

\*\sZ(?!\:)|(?<!\*\s)Z\: 

一個DEMO

+0

即使OP說了一個或另一個,他只是簡單的'|'。他只是想知道如何不重複'Z'。 – ndn

+0

他說:「有沒有辦法在不重複模式的情況下完成這項工作?」。答案是「否」,因爲「XOR」不是正則表達式的基本構建塊。 – fronthem

+0

我已經回答「NO」,並建議他完成他所說的「我希望能匹配'\ * \ sZ'或'Z \:',但不能同時也不匹配。」我在回答中給了他一個正則表達式。 – fronthem

相關問題