我想寫一個正則表達式這將匹配文本塊的(不一定是重複的)序列,如:使用逆向引用來引用的模式,而不是實際的比賽
foo,bar,foo,bar
我最初的想法是使用反向引用,像
(foo|bar)(,\1)*
但事實證明,這種正則表達式只匹配foo,foo
或bar,bar
但不foo,bar
或bar,foo
(依此類推)。
是否有任何其他方式來引用模式的一部分?
在現實世界中,foo
和bar
是長度超過50個字符的正則表達式,我只是想避免複製粘貼它們來定義一個序列。
我想寫一個正則表達式這將匹配文本塊的(不一定是重複的)序列,如:使用逆向引用來引用的模式,而不是實際的比賽
foo,bar,foo,bar
我最初的想法是使用反向引用,像
(foo|bar)(,\1)*
但事實證明,這種正則表達式只匹配foo,foo
或bar,bar
但不foo,bar
或bar,foo
(依此類推)。
是否有任何其他方式來引用模式的一部分?
在現實世界中,foo
和bar
是長度超過50個字符的正則表達式,我只是想避免複製粘貼它們來定義一個序列。
隨着體面的正則表達式的味道,你可以使用(foo|bar)(?:,(?-1))*
或類似的東西。 但Java不支持子模式調用。
所以,你最終可以選擇做String替換/格式,就像在ajx的答案中一樣,或者如果你知道什麼時候應該存在,什麼時候不應該,你可以調整逗號。例如:
(?:(?:foo|bar)(?:,(?!$|\s)|))+
反向引用的要點是匹配匹配的實際文本,而不是模式,所以我不確定你可以使用它。
你可以使用量詞,如:
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個或多個實例(後跟逗號)
也許你可以通過位在Java中建立自己的正則表達式位,如在:
String subRegex = "foo|bar";
String fullRegex = String.format("(%1$s)(,(%1$s))*", subRegex);
第二行可以分解爲一個函數。該函數將採用一個子表達式並返回一個完整的正則表達式,該正則表達式將匹配以逗號分隔的子表達式列表。
我真的不能這樣做(請參閱我在Matt的回答下的評論)。但是,如果沒有乾淨的方式來引用像這樣的模式部分,我只會接受它。 – mindas 2012-03-01 16:18:38
我的問題是正則表達式是在外部定義的,模式是靜態編譯的。你的方法可能有效,但它不能驗證逗號在最後一次出現之後是否不存在,並且出現在其他之間。 – mindas 2012-03-01 16:09:29
我可能會誤解,但是不能僅僅將外部模式放入變量中並將其插入模式 - 請參閱上面的編輯版本。 – 2012-03-01 16:26:49
事情是,我做不到。有一個遺留框架基於定義的正則表達式驗證事物,不同的對象類型具有不同的正則表達式分配。僅僅爲一種類型的數據使用特殊機制將是不可接受的。無論如何感謝您的意見。 – mindas 2012-03-01 16:31:52