簡體   English   中英

使用反向引用來引用模式而不是實際匹配

[英]Using backreference to refer to a pattern rather than actual match

我正在嘗試編寫一個匹配(不一定重復)文本塊序列的正則表達式,例如:

foo,bar,foo,bar

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

(foo|bar)(,\\1)*

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

有沒有其他方法可以引用模式的一部分?

在現實世界中, foobar是50多個字符長的正則表達式,我只是想避免復制粘貼它們來定義序列。

有了正常的正則表達式,你可以使用(foo|bar)(?:,(?-1))*等。 但Java不支持子模式調用。

因此,您最終可以選擇在ajx的答案中執行字符串替換/格式化,或者如果您知道它何時應該存在且何時不存在,則可以調整逗號。 例如:

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

也許你可以在Java中逐位構建你的正則表達式,如:

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

第二行可以分解為函數。 該函數將采用子表達式並返回與逗號分隔的子表達式列表匹配的完整正則表達式。

后引用的要點是匹配匹配的實際文本,而不是模式,因此我不確定您是否可以使用它。

你可以使用如下的量詞:

    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();

這將匹配2個或更多的foo或bar實例(后跟逗號)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM