Java 使用正则表达式获取两个字符串之间的子字符串
我有包含如下代码的xml文件Java 使用正则表达式获取两个字符串之间的子字符串,java,regex,Java,Regex,我有包含如下代码的xml文件 <bean id="ParentDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${JDBC.MYSQL.DRIVER}" /> <property name="password" value="${JDBC.MYSQL.PASSWORD}" /> <p
<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>
我尝试使用以下代码,但无法在正则表达式中添加$symbol
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));
}
请提出一些解决方案。这看起来确实是一个非常多的spring,它有内置的方法来用一个从.properties文件中获取的值替换${var\u name}:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="database.properties"/>
</bean>
加载应用程序上下文时,请将XML文件中的${var_name}替换为实际值。请尝试以下操作:
Try this:
String input = "abcabc pattern1foopattern2 abcdefg pattern1barpattern2 morestuff";
List<String> strings = Arrays.asList( input.replaceAll("^.*?pattern1", "").split("pattern2.*?(pattern1|$)"));
System.out.println( strings);
字符串输入=“abcabc pattern1foopattern2 abcdefg pattern1barpattern2 morestuff”;
List strings=Arrays.asList(input.replaceAll(“^.*?pattern1”和“”).split(“pattern2.*”(pattern1 |$)));
System.out.println(字符串);
我建议使用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());
}
}
}
}
导入java.io.File;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入org.w3c.dom.Document;
导入org.w3c.dom.NodeList;
导入org.w3c.dom.NamedNodeMap;
公开课演示{
公共静态void main(字符串[]args)引发异常{
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
documentdocument=db.parse(新文件(“sample.xml”);
NodeList propertyList=document.getElementsByTagName(“属性”);
if(propertyList!=null&&propertyList.getLength()>0){
对于(int i=0;i
您的正则表达式有几个问题。首先,您错过了{
字符。其次,您需要转义{
、}
和$
字符,因为它们是特殊字符。因此,这将起作用:
Pattern pattern = Pattern.compile("value=\"\\$\\{(.*?)\\}");
此外,您还需要致电:
有几个问题:您需要转义regexp中的一些特殊字符,最重要的是,您需要调用匹配器上的方法,例如
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");
}
注意,regexp要求$and{and}用反斜杠转义。由于您希望字符串中有一个实际的反斜杠,因此必须提供一个双反斜杠
只要一行上只出现一次${…}
,这似乎是可行的。如果有两次,匹配组将从第一次开始匹配到第二次结束!例如,如果输入为
abc${FOO}def${BAR}ghi
组将匹配FOO}def${BAR
,这可能不是您想要的
Pattern pattern = Pattern.compile("\\$\\{([^}]*)\\}");
这避免了生成问题。但是,这只匹配第一个匹配项。如果要处理多个匹配项,则必须编写一个内部循环,从上一个匹配项的末尾开始下一个匹配项。您真的必须在此处使用正则表达式吗?使用XML解析器不是更好吗?您为什么要输出它们?如果您的应用程序“您知道它们,应该记下它们或为它们提供默认值。@Pshemo此处不强制使用正则表达式。但xml文件是一个示例,其他文件也有不同的扩展名。@Salandur这是一个示例。其他不同的文件也有。主要问题是$sign。无法在正则表达式中包含$。”。
abc${FOO}def${BAR}ghi
Pattern pattern = Pattern.compile("\\$\\{([^}]*)\\}");