簡體   English   中英

如何使用java正則表達式替換字符串

[英]How to replace string using 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();            
    }
}

上面的代碼在文件中返回正確數量的自閉合錨標記,但替換代碼無法正常工作。

你的問題是貪婪。 .*"將匹配該行中的所有內容" 有兩個修復方法。 這兩個修復程序即將替換此行:

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

選項一:使用否定的字符類:

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

方案二:使用懶惰重復:

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

在這里查看更多。

由於文件結構似乎是“常量”,因此將問題簡化為簡單替換而不是復雜的html匹配可能更好。 在我看來,您對錨標記的內容並不感興趣,所以只需將/><span with ><span</span></p>替換為</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=\\\".*?\\\"(\\/><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();            
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM