【问题标题】:Java: Match with Regex and replace every characterJava:匹配正则表达式并替换每个字符
【发布时间】:2013-01-18 19:46:40
【问题描述】:

我有一个字符串,例如:

There exists a word *random*.

random 将是一个随机词。
如何使用正则表达式将random 的每个字符替换为* 并得到以下结果:

There exists a word ********.

所以* 替换了每个字符,在本例中为 6 个字符。
请注意,我只替换单词random,而不是周围的*。 到目前为止,我有:

str.replaceAll("(\\*)[^.]*(\\*)", "\\*");

但它将*random* 替换为*,而不是所需的********(共8 个)。
任何帮助,非常感谢...

【问题讨论】:

  • 你总是想在“有一个单词”之后替换单词?
  • 您想对**之间的单词进行屏蔽。我说的对吗?
  • @Achintya Jha,甚至整个句子都可能不同,所以基本上我想替换用*包裹的单词。
  • @Real,我不知道掩蔽是什么意思。我应该搜索它吗?
  • @MikeSpy.. 你能有多个这样的词吗?还是只有 1 个?

标签: java regex replace


【解决方案1】:

如果你只有一个这样的词:-

就当前示例而言,如果您只有一个这样的单词,那么您可以通过使用一些 String 类方法来避免正则表达式:-

String str = "There exists a word *random*.";

int index1 = str.indexOf("*");
int index2 = str.indexOf("*", index1 + 1);

int length = index2 - index1 - 1;   // Get length of `random`

StringBuilder builder = new StringBuilder();

// Append part till start of "random"
builder.append(str.substring(0, index1 + 1));

// Append * of length "random".length()
for (int i = 0; i < length; i++) {
    builder.append("*");
}

// Append part after "random"
builder.append(str.substring(index2));

str = builder.toString();

如果你可以有多个这样的词:-

为此,这里有一个正则表达式解决方案(这是它开始变得有点复杂的地方):-

String str = "There exists a word *random*.";
str = str.replaceAll("(?<! ).(?!([^*]*[*][^*]*[*])*[^*]*$)", "*");
System.out.println(str);

上面的模式用*替换所有直到最后没有string containing even numbers of *的字符。

哪个适合你,你可以使用。

我将添加对上述正则表达式的解释:-

(?<! )       // Not preceded by a space - To avoid replacing first `*`
.            // Match any character
(?!          // Not Followed by (Following pattern matches any string containing even number of stars. Hence negative look-ahead
    [^*]*    // 0 or more Non-Star character
    [*]      // A single `star`
    [^*]*    // 0 or more Non-star character
    [*]      // A single `star`
)*           // 0 or more repetition of the previous pattern.
[^*]*$       // 0 or more non-star character till the end.     

现在上面的模式将只匹配那些单词,它们是inside a pair of stars。前提是您没有任何不平衡的stars

【讨论】:

  • 我同意 Rohit 的观点。正则表达式用于模式,但您要搜索的是明确的东西。
  • 哇!那太精彩了!我尝试了将近 2 个小时来找到一个正则表达式,但一点运气都没有!而你 Robit Jain,在 5 分钟内想出了正则表达式!
  • @Rohit Jain:给你一个很好的答案 +1。
  • @MikeSpy.. 哈哈 :) 好吧,有一天你也会在 5 分钟内做出这样的正则表达式。这只是经验问题,没有别的。 :)
  • 非常感谢您的完整回答和提供的解释。我相信这是一个很好的参考,因为我没有在网上找到任何东西。
【解决方案2】:

您可以提取* 之间的单词,然后用* 替换所有字符。

import java.util.regex.*;

String txt = "There exists a word *random*.";
// extract the word
Matcher m = Pattern.compile("[*](.*?)[*]").matcher(txt);
if (m.find()) {
    // group(0): *random*
    // group(1): random
    System.out.println("->> " + m.group(0));
    txt = txt.replace(m.group(0), m.group(1).replaceAll(".", "*"));
}
System.out.println("-> " + txt);

你可以在ideone上看到:http://ideone.com/VZ7uMT

【讨论】:

    【解决方案3】:

    试试

        String s = "There exists a word *random*.";
        s = s.replaceAll("\\*.+\\*", s.replaceAll(".*(\\*.+\\*).*", "$1").replaceAll(".", "*"));
        System.out.println(s);
    

    输出

    There exists a word ********.
    

    【讨论】:

      【解决方案4】:
      public static void main(String[] args) {
          String str = "There exists a word *random*.";
          Pattern p = Pattern.compile("(\\*)[^.]*(\\*)");
      
          java.util.regex.Matcher m = p.matcher(str);
          String s = "";
          if (m.find())
              s = m.group();
      
          int index = str.indexOf(s);
          String copy = str;
          str = str.substring(0, index);
      
          for (int i = index; i < index + s.length(); i++) {
              str = str + "*";
          }
          str = str + copy.substring(index + s.length(), copy.length());
      
          System.out.println(str);
      
      }
      

      【讨论】:

        猜你喜欢
        • 2022-12-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-30
        • 2014-10-22
        • 1970-01-01
        • 2018-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多