gpt4 book ai didi

Java 正则表达式以条件替换器开头和结尾

转载 作者:行者123 更新时间:2023-11-30 04:00:44 26 4
gpt4 key购买 nike

我的文本中有如下行:

=== Keno ===

我想这样做如果一行以 = 开头并以 = 结尾我想添加一个新行字符和一个下划线。我的意思是:

=== Keno ===
_

我想用 Java 的正则表达式来实现。我怎样才能做到这一点?

PS:输入不是一行。我想检查输入的每一行是否符合我的需要。

最佳答案

您可以尝试以下操作:

String s = "=== Kendo ===";
String repl = "$1" + System.getProperty("line.separator") + "_";
String newString = s.replaceAll("(?m)^(=.*=)$", repl); // $1\n_

这也适用于多行字符串,例如:

=== foo ===
one
two
=== bar ===
three
four

会变成:

=== foo ===
_
one
two
=== bar ===
_
three
four

在这种情况下,使用 replaceAll/regex 是有意义的,但如果您正在处理单个字符串,我会说 regex 太过分了。


更新:

我对正则表达式与中午正则表达式进行了一些快速测试,在我所做的所有测试中,正则表达式方法的速度较慢。显然,这可能会根据输入数据(我拥有的所有不同输入)而改变。请自行测试,下面列出了我使用的代码(尽管具有不同/更大的测试数据)。

我不会发布任何结果,因为我还没有进行任何广泛的测试,但是对于没有输入的正则表达式,它的结果比非正则表达式变体更快,并且我确信您可以优化 replaceAllNoRegex 进一步的方法。

编辑:添加了第三个选项: replaceAllIndex 这甚至更快,请注意,我还没有对此进行广泛测试,因此可能存在错误,但使用 indexOf 甚至循环遍历当时的所有字符甚至更快比标记器看起来要好。

public static void main(String[] args) {
String s = "=== Etiam ===\neu\nmagna\nsit\namet\norci\nrutrum\nfeugiat\n\n=== Nunc ===\nurna\nlorem,\negestas\net\nvarius\nfermentum,\nconsectetur\nsed\nmauris\n";

long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++)
replaceAllNoRegex(s);

System.out.println("Tokens: " + (System.currentTimeMillis()-start));

start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++)
replaceAllIndex(s);

System.out.println("Index: " + (System.currentTimeMillis()-start));

start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++)
s.replaceAll("(?m)^(=.*?=)$", "$1\n_");

System.out.println("Regex: " + (System.currentTimeMillis()-start));
}

public static String replaceAllNoRegex(String s) {
StringTokenizer st = new StringTokenizer(s,"\n");
StringBuilder sb = new StringBuilder();
String next;
while (st.hasMoreElements()) {
next = (String) st.nextElement();
sb.append(next);
if (next.startsWith("=") && next.endsWith("=")) {
sb.append("\n_");
}
sb.append("\n");
}
return sb.toString();
}

public static String replaceAllIndex(String s) {
int index = 0, indexEnd, indexStart = 0;
StringBuilder sb = new StringBuilder();

while (index == 0 || (index = s.indexOf("\n=", index)) != -1) {
indexEnd = s.indexOf("\n",index+2);
if (indexEnd != -1 && s.charAt(indexEnd-1) == '=') {
sb.append(s.substring(indexStart,indexEnd));
sb.append("\n_\n");
indexStart = indexEnd + 1;
}
index = indexEnd+1;
}
sb.append(s.substring(indexStart));
return sb.toString();
}

关于Java 正则表达式以条件替换器开头和结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22040852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com