2010-10-20 54 views
2

我不知道這是可以做到的,但我需要一種方法來取代在運行時動態聲明一個字符串我正則表達式表達指定的編號組的值,一旦比賽有已經制成。正則表達式 - 集團的替代值

給出一個簡單的例子,像...

(/)?([A-Za-z0-9])?(/)?$ 

我希望能夠插件替換爲組2

我現在使用Java的匹配器類。

回答

2

是的,這是可行的。看看我的回答this question怎麼看。事實上,這個問題可能應該作爲重複來關閉。

你需要改變正則表達式一點。我不能告訴你想要做的事情,所以我不能給出任何細節,但最起碼​​你應該將組內的所有這些問號。

(/)?([A-Za-z0-9])?(/)?$ // NO 

(/?)([A-Za-z0-9]?)(/?)$ // YES 

但它仍然會匹配在目標字符串的結尾空字符串,因爲一切是除了主播,$可選。那真的是你的意思嗎?

0

回到你的正則表達式搜索的價值,並將其保存到一個變量,然後做有關使用正則表達式的搜索結果爲發現目標和你的動態聲明的字符串作爲替換你的主字符串替換。

真的簡化概念:

String testString = "Hello there"; 
//String substring = *Do your regex work here* 
if(substring.length() > 0) { 
    testString.replace(substring, dynamicallyGeneratedString); 
} 
5

我不知道這是可以做到的...

是的,這是可能的。看下面的例子。

我希望能夠插件替換爲組2

這個演示「插在」的.toUpperCase版本2組作爲替代品。

import java.util.regex.*; 

class Main { 
    public static void main(String... args) { 
     String input = "hello my name is /aioobe/ and I like /patterns/."; 
     Pattern p = Pattern.compile("(/)([A-Za-z0-9]+)(/)"); 
     Matcher m = p.matcher(input); 
     StringBuffer sb = new StringBuffer(); 
     while (m.find()) { 
      String rep = m.group(1) + m.group(2).toUpperCase() + m.group(3); 
      m.appendReplacement(sb, rep); 
     } 
     m.appendTail(sb); 
     System.out.println(sb); 
    } 
} 

打印:

hello my name is /AIOOBE/ and I like /PATTERNS/.