<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 8,  comments - 6,  trackbacks - 0

    2.5  使用正則表達式進行替換

    在上一節中,介紹了用于匹配一個String中的模式和用于從一個子模式組中檢索數據的正則表達式。使用regex,還可以用新的值替代匹配的模式。完成此操作的一種方法是使用Matcher類的replaceAll方法,它將返回一個字符串,將所有匹配的子串替換為給定的字符串。為了說明此方法,查找一個文件內出現的所有repetition單詞并使用單詞duplication來替換它們:
    String data = getStringData();
    Pattern repPattern = Pattern.compile("(\\s)(repetition)([\\s;\\.,])");
    Matcher repMatcher = repPattern.matcher(data);
    String newData = repMatcher.replaceAll("$1duplication$3");

    為了查找單詞,需要捕獲它前后的空白(或標點符號)。需要注意的是,如果此單詞出現在data字符串的開頭,那么上述的代碼不會匹配它,因為已假定它的前后存在空白符。除了單詞repetition被替換外,我們希望文本中的其他內容與原始文本保持一致,包括單詞周圍的空白字符。這里的美元符號($)顯然不表示貨幣。它表示對從regex模式中捕獲的組1和組3的逆向引用,包含最初匹配的空白或標點符號。這樣,與它們對應的值將插入到替換文本中。

    String類(在JDK 1.4或更高的版本中)有一個replaceAll方法,其工作機制類似于Matcher中的replaceAll方法。這使得它可以很方便地替換一個與模式匹配的子串:

    String data = getStringData();
    String result =
    data.replaceAll("(\\s)(repetition)([\\s;\\.,])", "$1duplication$3");

    replaceAll方法返回一個新的字符串,其中所有匹配的部分已被新值替換。但是,使用Matcher仍有很多優點,因為相對于字符串它有更大的靈活性。

    可以使用Matcher的find循環用新值依次替換每個匹配的部分。這樣使你能夠更好地控制替換過程。比如,可以在每次匹配的過程中應用其他邏輯,甚至每次可以替換不同的值。這就用到了StringBuffer,StringBuffer用于保存更新的文本,并且一旦調用appendReplacement方法,Matcher就追加更新后的文本到緩存中。在處理每個匹配并執行替換后,需要使用appendTail方法將最后一次匹配后的剩余字符串放置在輸出緩存中。圖2-1說明了子串匹配和這兩種方法之間的關系。

    圖2-1  Matcher類的append方法 
    Matcher有一個相應的append指針。指針最初從零開始,隨著每次調用appendReplacement向前移動。這種設計是為了在一個find循環內使用它。每次匹配后,調用appendReplacement方法,Matcher將指針所在的上一個位置到匹配之前指針所在的位置之間的內容,即未更改的文本合并到StringBuffer中。然后,Matcher替換當前匹配的文本并將替換后的內容放置在StringBuffer中。接下來,Matcher將append指針移動到當前匹配結尾之后的第一個字符,然后重復此過程直到不再產生匹配。在找到所有匹配之后很可能剩下一個未匹配的部分。為了將這部分文本添加到輸出StringBuffer中,使用appendTail方法。
    現在使用這些方法將前面的替換例子重寫為一個循環。但是這一次對于每個匹配,將使用一個隨機選擇的同義詞(repetition、duplication、copying、reiteration、recurrence或redundancy)來替代單詞repetition:
    StringBuffer result = new StringBuffer();
    String[] wordChoices = new String[]
    {"repetition", "duplication", "copying",
    "reiteration", "recurrence", "redundancy"};
    Random rand = new Random();
    String data = getStringData();
    Pattern repPattern = Pattern.compile("(\\s)(repetition)([\\s;\\.,])");
    Matcher repMatcher = repPattern.matcher(data);
    while (repMatcher.find()) {
    // pick a word at random
    int wordIndex = rand.nextInt(wordChoices.length);
    String replacement = "$1" + wordChoices[wordIndex] + "$3";
    repMatcher.appendReplacement(result, replacement);
    }
    repMatcher.appendTail(result);
    System.out.println(result);

    可以按需求改寫find循環中的邏輯來對每個匹配進行所需的處理。此外,還可以使用前面討論過的Matcher的方法:group、start和end。可以使用這些技術的組合有選擇地修改或刪除一個文件中每部分匹配的文本。

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    留言簿(1)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    主站蜘蛛池模板: 亚洲av无码专区在线观看下载| 亚洲国产一区二区三区青草影视| 中文字幕av免费专区| 日本一区免费电影| 亚洲欧美精品午睡沙发| 在线jyzzjyzz免费视频| 亚洲AV无码码潮喷在线观看| 热久久这里是精品6免费观看| 亚洲精品白浆高清久久久久久 | 无码午夜成人1000部免费视频| 亚洲乱码国产一区三区| baoyu116.永久免费视频| 亚洲AV永久青草无码精品| 在线观看免费中文视频| 亚洲一级片免费看| 精品亚洲AV无码一区二区 | 国产高清免费在线| 亚洲a一级免费视频| 无码免费一区二区三区免费播放| 亚洲精品成人久久| 成人免费在线观看网站| 成人免费视频一区二区| 久久综合九九亚洲一区| 免费看国产成年无码AV片| 亚洲AV女人18毛片水真多| 亚洲色偷偷狠狠综合网| 99视频在线免费看| 国产亚洲精品美女久久久| 污污网站18禁在线永久免费观看| 亚洲人成在久久综合网站| 3344永久在线观看视频免费首页| 亚洲一区二区三区在线| 亚洲AV网站在线观看| 无码精品国产一区二区三区免费 | 亚洲A丁香五香天堂网| 暖暖免费日本在线中文| 亚洲熟妇无码AV| 99无码人妻一区二区三区免费| 亚洲国产成人综合精品| 在线免费观看中文字幕| 一区二区3区免费视频|