Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用正则表达式获取两个字符串之间的子字符串_Java_Regex - Fatal编程技术网

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

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

我有包含如下代码的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>
我尝试使用以下代码,但无法在正则表达式中添加$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("\\$\\{([^}]*)\\}");