项目中一个地方用到了正则表达式,今天突然遇到一个问题,一个字符串匹配不到,找了半天没找到原因,请各位帮忙看看,多谢
java代码如下:import java.io.BufferedReader;
import java.io.FileReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test22 { /**
 * @param args
 */
public static void main(String[] args) throws Exception{
BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\yeal\\Desktop\\str.txt"));
String temp,paramStr="";
while((temp=reader.readLine())!=null)
paramStr += temp+"\n";
reader.close();
System.out.println("之前:");
System.out.println(paramStr);
Pattern pattern = Pattern.compile("\\[\\[.*?\\]\\]");
Matcher localMatcher1 = pattern.matcher(paramStr);
while (localMatcher1.find()) {
int i = localMatcher1.start();
int j = localMatcher1.end();
// 原字符串拆分
String xquery = paramStr.substring(i + 2, j - 2);
String startStr = paramStr.substring(0, i);
String endStr = paramStr.substring(j, paramStr.length());
paramStr = startStr + "replaced"+endStr;
System.out.println("-------------------------------\n"+xquery+"\n-------------------------------");
}
System.out.println("之后:");
System.out.println(paramStr);
}
}其中文件str.txt的内容如下:
<root>
  <data>
    <input_val>
      <parameter name="UserId" value="odso"/>
      <parameter name="Password" value="odso2009"/>
      <parameter name="UserIp" value="134.64.99.7"/>
      <parameter name="AreaId" value="551"/>
      <parameter name="OffiNum" value=""/>
      <parameter name="Action" value="QC05"/>
      <parameter name="UserType" value="0"/>
      <parameter name="PhoneNo" value=""/>
      <parameter name="UserNo" value="lxl4471744"/>
      <parameter name="PortNo" value=""/>
      <parameter name="OperationId" value="4"/>
      <parameter name="SynTimeOut" value="20000"/>
      <parameter name="880001" value="[[concat(if(number(substring('201009', 5, 2)) + 1 = 13) then concat(number(substring('201009', 1, 4)) + 1, '-', '01')
       else
         if(number(substring('201009', 5, 2)) + 1 > 9) then concat(substring('201009', 1, 4), '-', number(substring('201009', 5, 2)) + 1)
         else concat(substring('201009', 1, 4), '-', concat('0', number(substring('201009', 5, 2)) + 1)), '-01 00:00:00')]]"/>
      <parameter name="880002" value="[[concat(if(number(substring('201009', 5, 2)) + 1 = 13) then concat(number(substring('201009', 1, 4)) + 1, '-', '01')
       else
         if(number(substring('201009', 5, 2)) + 1 > 9) then concat(substring('201009', 1, 4), '-', number(substring('201009', 5, 2)) + 1)
         else concat(substring('201009', 1, 4), '-', concat('0', number(substring('201009', 5, 2)) + 1)), '-31 23:59:59')]]"/>
    </input_val>
  </data>
</root>
程序的作用就是读取这个文件里面的东西形成一个字符串,然后用正则匹配里面的双中括号[[  ]], 把这些东西替换成replaced,但是运行发现,正则匹配不到里面的双中括号,可是字符串里面确实是有双中括号的,不知道为什么,请各位解惑,谢谢!

解决方案 »

  1.   


    System.out.println(paramStr.replaceAll("\\[\\[[^\\[\\]]*?\\]\\]", "replaced"));
      

  2.   


    BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\yeal\\Desktop\\str.txt"));
            StringBuilder sb = new StringBuilder();
            String str = null;
            while ((str = reader.readLine()) != null) {
                sb.append(str);
            }
            String temp=sb.toString();
            Matcher m =
                    Pattern.compile("value=\"(\\[\\[[^\\[\\]]*\\]\\]\")", Pattern.DOTALL)
                        .matcher(temp);
      
            while(m.find()){
                temp=temp.replace(m.group(1),"replaced");
            }
            System.out.println(temp.replaceAll("(?<=>)\\s*(?=<)","\r\t"));