如何使用java正则表达式替换字符串

时间:2016-04-18 13:23:46

标签: java regex

我有一个包含自动关闭锚标记的文件

  <p><a name="impact"/><span class="sectiontitle">Impact</span></p>
<p><a name="Summary"/><span class="sectiontitle">Summary</span></p>

我想更正下面的标签

    <p><a name="impact"><span class="sectiontitle">Impact</span></a></p>
<p><a name="Summary"><span class="sectiontitle">Summary</span></a></p>

我已编写此代码以查找和替换错误的锚标记

   package mypack;
import java.io.*;
import java.util.regex.*;


public class AnchorIssue {

    static int count=0;
    public static void main(String[] args) throws IOException {
        Pattern pFinder = Pattern.compile("<a name=\\\".*\\\"(\\/)>(.*)(<)");
        BufferedReader r = new BufferedReader
                  (new FileReader("D:/file.txt"));
                  String line;
                  while ((line =r.readLine()) != null) {
                     Matcher m1= pFinder.matcher(line);
                     while (m1.find()) {
                        int start = m1.start(0);
                        int end = m1.end(0);
                        ++count;

//                  Use CharacterIterator.substring(offset, end);
                        String actual=line.substring(start, end);
                        System.out.println(count+"."+"Actual String :-"+actual);

                         actual.replace(m1.group(1),"");
                         System.out.println(actual);
                         actual.replaceAll(m1.group(3),"</a><");
                         System.out.println(actual);

//              Use CharacterIterator.substring(offset, end);
                    System.out.println(count+"."+"Replaced"+actual);


      }

} 
    r.close();            
    }
}

上面的代码在文件中返回正确数量的自闭合锚标记,但替换代码无法正常工作。

3 个答案:

答案 0 :(得分:0)

你的问题是贪婪。即.*"将匹配该行中最后一个"的所有内容。有两个修复方法。 这两个修复程序即将替换此行:

Pattern pFinder = Pattern.compile("<a name=\\\".*\\\"(\\/)>(.*)(<)");

选项一:使用否定的字符类:

Pattern pFinder = Pattern.compile("<a name=\\\"[^\\"]*\\\"(\\/)>(.*)(<)");

选项二:使用延迟重复:

Pattern pFinder = Pattern.compile("<a name=\\\".*?\\\"(\\/)>(.*)(<)");

查看更多here

答案 1 :(得分:0)

由于文件结构似乎是&#34;常量&#34;,因此将问题简化为简单替换而不是复杂的html匹配可能更好。在我看来,您对锚标记的内容并不是真正感兴趣,所以只需将</span></p>替换为</span></a></p>,将<html> <head> ... <base href="http://www.example.com/"> <link href="/assets/css/style.css" rel="stylesheet"> ... </head> 替换为return $this->hasMany('App\Tag', 'tag_key_id');

答案 2 :(得分:0)

使用以下代码,我可以找到并替换所有自闭式锚标签。

    package mypack;
import java.io.*;
import java.util.regex.*;


public class AnchorIssue {

    static int count=0;
    public static void main(String[] args) throws IOException {
        Pattern pFinder = Pattern.compile("<a name=\\\".*?\\\"(\\/><span)(.*)(<\\/span>)");
        BufferedReader r = new BufferedReader
                  (new FileReader("file.txt"));
                  String line;
                  while ((line =r.readLine()) != null) {
                     Matcher m1= pFinder.matcher(line);
                     while (m1.find()) {
                        int start = m1.start(0);
                        int end = m1.end(0);
                        ++count;

//                  Use CharacterIterator.substring(offset, end);
                        String actual=line.substring(start, end);
                        System.out.println(count+"."+"Actual String : "+actual);


                        actual= actual.replaceAll(m1.group(1),"><span");
                     System.out.println("\n");

                        actual= actual.replaceAll(m1.group(3),"</span></a>");

                    System.out.println(count+"."+"Replaced : "+actual);
                    System.out.println("\n");
                    System.out.println("---------------------------------------------------");


      }

} 
    r.close();            
    }
}