java 正则表达式匹配和替换< ..>字符

niwlg2el  于 2022-12-02  发布在  Java
关注(0)|答案(4)|浏览(153)

我需要匹配整个句子中的所有array<..>,并且只将<>替换为[](将〈〉替换为具有前缀array的[])。
我没有任何解决这个问题的线索,如果有人能提供任何线索就好了。

输入

<tr><td>Asdft array<object> tesnp array<int></td>
<td>asldhj
ashd
repl array<String>
array
asdhl
afe array<object>
endoftest</td></tr>

预期输出

<tr><td>Asdft array[object] tesnp array[int]</td>
<td>asldhj
ashd
repl array[String]
array
asdhl
afe array[object]
endoftest</tr></td>
vc9ivgsu

vc9ivgsu1#

使用regexarray<(\w+)>array<>中的单词字符匹配为组1,并将尖括号替换为方括号,使array和组1保持不变。

演示

public class Main {
    public static void main(String[] args) {
        String str = """
                <tr><td>Asdft array<object> tesnp array<int></td>
                <td>asldhj
                ashd
                repl array<String>
                array
                asdhl
                afe array<object>
                endoftest</td></tr>
                       """;

        String result = str.replaceAll("array<(\\w+)>", "array[$1]");

        System.out.println(result);
    }
}

输出

<tr><td>Asdft array[object] tesnp array[int]</td>
<td>asldhj
ashd
repl array[String]
array
asdhl
afe array[object]
endoftest</td></tr>
vyswwuz2

vyswwuz22#

这可以通过一个简单的正则表达式很容易地完成:

(?<=array)  // positive lookbehind (preceded by "array")
<           // opening angle bracket
(\w+)       // one or more word characters (matching group)
>           // closing angle bracket

工作示例

import java.util.regex.*;

public class Example {
    public static String replace(String str, String pattern, String replacement) {
        return Pattern
            .compile(pattern, Pattern.MULTILINE)
            .matcher(str)
            .replaceAll(replacement);
    }
    
    public static String fixHtmlText(String htmlText) {
        return replace(htmlText, "(?<=array)<(\\w+)>", "[$1]");
    }
    
    public static void main(String[] args) {
        String htmlText = "<tr><td>Asdft array<object> tesnp array<int></td>\n"
                        + "<td>asldhj\n"
                        + "ashd\n"
                        + "repl array<String>\n"
                        + "array\n"
                        + "asdhl\n"
                        + "afe array<object>\n"
                        + "endoftest</td></tr>";
        
        System.out.println(fixHtmlText(htmlText));
    }
}

输出

<tr><td>Asdft array[object] tesnp array[int]</td>
<td>asldhj
ashd
repl array[String]
array
asdhl
afe array[object]
endoftest</td></tr>
vbopmzt1

vbopmzt13#

可以使用.replace()方法。该方法在字符串中搜索指定的字符,并返回一个新字符串,其中指定的字符被替换。
在你的例子中,你不需要正则表达式,所以你可以写:

String replacedStr = text.replace("array<object>", "array[object]");
bxjv4tth

bxjv4tth4#

您可以在这里避免使用regexp。

public static String replaceMacro(String str) {
    final String pattern = "array<";
    StringBuilder buf = new StringBuilder(str.length());
    int fromIndex = 0;

    while (true) {
        int lo = str.indexOf(pattern, fromIndex);

        if (lo >= 0) {
            lo += pattern.length() - 1;
            int hi = str.indexOf('>', lo);

            buf.append(str, fromIndex, lo);
            buf.append('[');
            buf.append(str.substring(lo + 1, hi));
            buf.append(']');

            fromIndex = hi + 1;
        } else {
            buf.append(str.substring(fromIndex));
            break;
        }
    }

    return buf.toString();
}

如果要使用regexp:

public static String replaceMacro(String str) {
    Pattern pattern = Pattern.compile("(array)<(\\w+)>");
    Matcher matcher = pattern.matcher(str);

    StringBuilder buf = new StringBuilder(str.length());
    int fromIndex = 0;

    while (matcher.find(fromIndex)) {
        int lo = matcher.start();
        int hi = matcher.end();

        buf.append(str, fromIndex, lo).append(matcher.group(1));
        buf.append('[').append(matcher.group(2)).append(']');

        fromIndex = hi;
    }

    if (fromIndex < str.length()) {
        buf.append(str.substring(fromIndex));
    }

    return buf.toString();
}

相关问题