簡體   English   中英

Java的String .replaceFirst無法正常工作,我不知道它是否是錯誤或我做錯了

[英]Java's String .replaceFirst is not working and I don't know if its a bug or I did it wrong

好的,當我使用string.replace()時,我有一種替換文本的方法可以正常工作,但是當我如下圖所示切換到relpaceFirst()時,它不再有效,這是我做錯了還是錯過了?

private void acceptAccButtonActionPerformed(java.awt.event.ActionEvent evt) {      
    int selectedAcTableItem = validAcTable.getSelectedRow();
    int selectedSugTableItem = suggestedAcTable.getSelectedRow();
    if (selectedAcTableItem > 0) {
        String acNameDefthmlText = htmlText;
        String parensName = "";
        String acName = validAcTable.getValueAt(selectedAcTableItem, 0).toString();
        String acDef = validAcTable.getValueAt(selectedAcTableItem, 1).toString();
        String acSent = validAcTable.getValueAt(selectedAcTableItem, 2).toString();
        StringBuilder acBuilder = new StringBuilder(acDef);
        acBuilder.append(" (").append(acName).append(")");            
        if (!acDef.equals("")) {
            parensName = " (" + acName + ")";
            if (htmlText.contains(acName) && !htmlText.contains(acBuilder)){
                String acReplace = acBuilder.toString();
                String acOrigDefName = acDefRow + parensName;
                if (htmlText.contains(acOrigDefName) && parensName.contains(acOrigName)){
                    acNameDefthmlText = htmlText.replaceFirst(acOrigDefName, acReplace);
                } else if (htmlText.contains(acName)) {
                    acNameDefthmlText = htmlText.replaceFirst(acName, acReplace);
                }
                htmlText = acNameDefthmlText;

            }                
            validAcTable.setValueAt(true, selectedAcTableItem, 2);
            Acronym acronym = createNewAcronym(acName, acSent, acDef, true);
            try {

                AcronymDefinitionController.sharedInstance().writeAcronymToExcelSheet(acName, acDef);
            } catch (IOException ex) {
                Exceptions.printStackTrace(ex);
            } catch (InvalidFormatException ex) {
                Exceptions.printStackTrace(ex);
            }
            if (validAcTable.getRowCount() - 1 >= validAcTable.getSelectedRow() + 1) {
                validAcTable.changeSelection(selectedAcTableItem + 1, 0, true, true);
            }
            validAcTable.repaint();
        }
    }

如果您注意到有問題的兩種方法的簽名:

replace(char oldChar,char newChar);
replace(CharSequence target, CharSequence replacement);

replaceFirst(String regex, String replacement);

如您所見,在replaceFirst您將匹配的參數視為regex (正則表達式),如果參數中包含任何特殊字符,則將導致差異。

例如:考慮以下內容:

System.out.println("abcdab".replace("ab", "ef"));  //<- replaces all
System.out.println("abcdab".replaceFirst("ab", "ef"));//<-replaces first
System.out.println("\\abcdab".replace("\\ab", "ef")); //<-replaces first
System.out.println("\\abcdab".replaceFirst("\\ab", "ef"));
//^ doesn't replace as `\` is an special char

暫無
暫無

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

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