【问题标题】:Regex or String Manipulation by IndexOf? [duplicate]IndexOf 的正则表达式或字符串操作? [复制]
【发布时间】:2019-11-10 14:16:04
【问题描述】:

我必须在字符串中替换匹配词出现前后的字符。

我想知道:

1.当我使用正则表达式或使用 indexOf、循环等时,功能是否更好?

2.什么被认为是更可读的代码:正则表达式或使用 indexOf、遍历字符串等?

3.时间复杂度的方式降低复杂度。

澄清一下,我要问的是使用正则表达式或只是进行字符串操作更好。看看我上面的问题

【问题讨论】:

  • 你能告诉我们这个字符串和它的替换是什么吗?
  • @TimBiegeleisen,添加了一个示例。
  • 可能最有效的方法是简单地匹配 (abc)|. 并在进行匹配时,如果设置了第一组,则将 group(1) 附加到新字符串,否则附加 *。另见The Best Regex Trick。或者您可以使用基于\G 的模式(例如(?:(?<=abc)|\G)(?!abc).)来做一个replaceAll()

标签: java regex string performance time


【解决方案1】:

这是一个使用正式的 Java 正则表达式模式匹配器的迭代解决方案:

String input = "abc1111abc3434";
StringBuffer buffer = new StringBuffer();
String pattern = "((?!abc).)*abc";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(input);
while (m.find()) {
    String replace = m.group(0).replaceAll(".", "*");
    replace = replace.substring(0, replace.length()-3) + "abc";
    m.appendReplacement(buffer, replace);
}
int length = buffer.length();
m.appendTail(buffer);
String result = buffer.substring(0, length) + buffer.substring(length).replaceAll(".", "*");
System.out.println(result);

打印出来:

abc****abc****

这里使用的技巧是以下正则表达式模式:

((?!abc).)*abc

这将匹配不是序列abc但以abc结尾的任何内容。也就是说,此模式的第一部分是您要使用*** 屏蔽的实际内容。在每场比赛中,我们将被屏蔽的内容附加到 StringBuffer 后跟 abc 标记。请注意,这会创建一个边缘情况。完成所有替换后,可能会出现非abc 内容的尾部。在这种情况下,我们只是屏蔽了整个子字符串并附加到 StringBuffer。

【讨论】:

  • 查看我的问题编辑。
  • 不会改变我的答案。我认为 Java 中没有纯正则表达式解决方案,我的答案同时使用了正则表达式和字符串操作。
  • 查看@Jigar Gajjar 的回答,他对此有正则表达式
【解决方案2】:

调用close()方法,一旦资源使用完成。

这确保资源被关闭,并清除分配的内存。

在你的情况下,

input1.close();

input2.close();

在你的两个结果都打印出来之后。

扫描仪(JDK8)的详细API:https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html

【讨论】:

    【解决方案3】:
    String str ="abc1111abc3434";
    System.out.println( str.replaceAll("[^\"abc\"]", "*"));
    

    【讨论】:

    • 这个正则表达式效果很好,但你能解决我的具体问题吗?
    猜你喜欢
    • 2011-12-20
    • 2022-01-20
    • 2019-09-21
    • 2011-04-06
    • 2023-02-23
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多