使用正则表达式获取两个字符串之间的子字符串

时间:2013-11-23 09:55:21

标签: 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}" />
    <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));
}

请提出一些解决方案。

5 个答案:

答案 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("\\$\\{([^}]*)\\}");

这可以避免跨越问题。但是,这仅匹配第一次出现。处理多个匹配时,你必须编写一个内循环,在前一个匹配结束时开始下一个匹配。