我有包含
等代码的xml文件<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>
我希望使用java代码获取value = {和}之间的所有标记。对于以上文字需要低于输出:
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 :(得分:0)
这看起来确实很多,它构建了一些方法来替换$ {var_name},其值来自.properties文件:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="database.properties"/>
</bean>
这个漂亮的代码片段在加载应用程序上下文时用实际值替换XML文件中的$ {var_name}。
答案 1 :(得分: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);
答案 2 :(得分: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());
}
}
}
}
答案 3 :(得分:0)
你的正则表达式有几个问题。首先,您错过了{
字符。其次,您需要同时转义{
,}
和$
字符,因为它们是特殊字符。所以,这将有效:
Pattern pattern = Pattern.compile("value=\"\\$\\{(.*?)\\}");
此外,您需要致电matcher.find()
:
if (matcher.find()) {
System.out.println(matcher.group(1));
}
答案 4 :(得分: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("\\$\\{([^}]*)\\}");
这可以避免跨越问题。但是,这仅匹配第一次出现。处理多个匹配时,你必须编写一个内循环,在前一个匹配结束时开始下一个匹配。