2012-03-01 21 views
1

我想寫一個正則表達式這將匹配文本塊的(不一定是重複的)序列,如:使用逆向引用來引用的模式,而不是實際的比賽

foo,bar,foo,bar

我最初的想法是使用反向引用,像

(foo|bar)(,\1)*

但事實證明,這種正則表達式只匹配foo,foobar,bar但不foo,barbar,foo(依此類推)。

是否有任何其他方式來引用模式的一部分?

在現實世界中,foobar是長度超過50個字符的正則表達式,我只是想避免複製粘貼它們來定義一個序列。

回答

3

隨着體面的正則表達式的味道,你可以使用(foo|bar)(?:,(?-1))*或類似的東西。 但Java不支持子模式調用。

所以,你最終可以選擇做String替換/格式,就像在ajx的答案中一樣,或者如果你知道什麼時候應該存在,什麼時候不應該,你可以調整逗號。例如:

(?:(?:foo|bar)(?:,(?!$|\s)|))+ 
0

反向引用的要點是匹配匹配的實際文本,而不是模式,所以我不確定你可以使用它。

你可以使用量詞,如:

String s= "foo,bar,foo,bar"; 
      String externalPattern = "(foo|bar)"; // comes from somewhere else 
      Pattern p = Pattern.compile(externalPattern+","+externalPattern+"*"); 
    Matcher m = p.matcher(s); 
    boolean b = m.find(); 

這將匹配FOO或酒吧的2個或多個實例(後跟逗號)

+0

我的問題是正則表達式是在外部定義的,模式是靜態編譯的。你的方法可能有效,但它不能驗證逗號在最後一次出現之後是否不存在,並且出現在其他之間。 – mindas 2012-03-01 16:09:29

+0

我可能會誤解,但是不能僅僅將外部模式放入變量中並將其插入模式 - 請參閱上面的編輯版本。 – 2012-03-01 16:26:49

+0

事情是,我做不到。有一個遺留框架基於定義的正則表達式驗證事物,不同的對象類型具有不同的正則表達式分配。僅僅爲一種類型的數據使用特殊機制將是不可接受的。無論如何感謝您的意見。 – mindas 2012-03-01 16:31:52

1

也許你可以通過位在Java中建立自己的正則表達式位,如在:

String subRegex = "foo|bar"; 
String fullRegex = String.format("(%1$s)(,(%1$s))*", subRegex); 

第二行可以分解爲一個函數。該函數將採用一個子表達式並返回一個完整的正則表達式,該正則表達式將匹配以逗號分隔的子表達式列表。

+0

我真的不能這樣做(請參閱我在Matt的回答下的評論)。但是,如果沒有乾淨的方式來引用像這樣的模式部分,我只會接受它。 – mindas 2012-03-01 16:18:38

相關問題