2013-11-23 22 views
0

我有一個包含像得到子

<bean id="ParentDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
    <property name="driverClass" value="${JDBC.MYSQL.DRIVER}" /> 
    <property name="password" value="${JDBC.MYSQL.PASSWORD}" /> 
    <property name="user" value="${JDBC.MYSQL.USERNAME}" /> 
</bean> 

代碼XML文件我想獲得價值= {和}使用Java代碼之間的所有令牌。對於以上輸出的文字需求如下:

JDBC.MYSQL.DRIVER 
JDBC.MYSQL.PASSWORD 
JDBC.MYSQL.USERNAME 

我試着用下面的代碼,但是不能在正則表達式中加$符號。

BufferedReader reader = new BufferedReader(new FileReader(file)); 
Pattern pattern = Pattern.compile("value=\"$(.*?)}"); 
String line; 
while((line=reader.readLine())!=null) { 
    Matcher matcher = pattern.matcher(line); 
    System.out.println(matcher.group(1)); 
} 

請提出一些解決方案。

+0

你真的必須在這裏使用正則表達式嗎?使用XML解析器會不會更好? – Pshemo

+0

爲什麼你想要輸出它們?如果你使你的應用上下文知道它們,並且應該寫下它們或爲它們提供默認值。 – Salandur

+0

@Pshemo它不是必須在這裏使用正則表達式。但xml文件是一個示例其他文件也有不同的擴展名。 – kuldeep

回答

0

有幾個問題與您正則表達式。首先,你錯過了{角色。其次,你需要逃避{,}$字符,因爲它們是特殊字符。因此,這將工作:

Pattern pattern = Pattern.compile("value=\"\\$\\{(.*?)\\}"); 

此外,您將需要調用matcher.find()

if (matcher.find()) {  
    System.out.println(matcher.group(1)); 
} 
0

這看起來的確非常多的彈簧,其已建立的方法與從屬性文件取一個值替換$ {} VAR_NAME:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="database.properties"/> 
</bean> 

這個漂亮的片段,同時更換$ {VAR_NAME }加載應用程序上下文時,在您的XML文件中使用實際值。

0
Try this: 

String input = "abcabc pattern1foopattern2 abcdefg pattern1barpattern2 morestuff"; 
    List<String> strings = Arrays.asList(input.replaceAll("^.*?pattern1", "").split("pattern2.*?(pattern1|$)")); 
    System.out.println(strings); 
+0

主要問題是帶$符號。在正則表達式中不能包含$。 – kuldeep

0

我會推薦使用XML解析器。

試試這個

import java.io.File; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.NodeList; 
import org.w3c.dom.NamedNodeMap; 

public class Demo { 

public static void main(String[] args) throws Exception { 

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    Document document = db.parse(new File("sample.xml")); 
    NodeList propertyList = document.getElementsByTagName("property"); 

    if(propertyList !=null && propertyList.getLength() > 0) { 
    for(int i =0; i< propertyList.getLength(); i++) { 
     NamedNodeMap node = propertyList.item(i).getAttributes(); 
     System.out.println(node.getNamedItem("value").getNodeValue()); 
    } 
    } 
} 
} 
0

的幾個問題:你需要逃避一些正則表達式的特殊字符,以及最重要的是,您需要在匹配器上調用一個方法,例如find(),以使其進行匹配。試試這個:

Pattern pattern = Pattern.compile("\\$\\{(.*)\\}"); 
    Matcher matcher = pattern.matcher(s); 
    if (matcher.find()) { 
     System.out.println(matcher.group(1)); 
    } else { 
     System.out.println("not found"); 
    } 

請注意,正則表達式需要使用$和{和}以反斜槓進行轉義。既然你想在字符串中使用實際的反斜槓,你必須提供一個雙反斜槓。

這似乎工作,只要有一個發生${...}就行。如果有兩個,比賽組將從第一個開始到第二個結束匹配!例如,如果輸入的是

abc${FOO}def${BAR}ghi 

組將匹配FOO}def${BAR這可能不是你想要的。如果你需要處理這個問題,你可以使用像

Pattern pattern = Pattern.compile("\\$\\{([^}]*)\\}"); 

這可以避免跨越問題。但是,這隻匹配第一次出現。要處理多個匹配,你必須編寫一個內部循環,在上一個匹配結束時開始下一個匹配。

+0

Thanx @Stuart它爲我工作.. – kuldeep