Java 如何转换;“字符串”;至*s*t*r*i*n*g*”;

Java 如何转换;“字符串”;至*s*t*r*i*n*g*”;,java,regex,replace,string,Java,Regex,Replace,String,我需要像这样转换字符串 "string" 到 正则表达式的模式是什么?语言是Java。我认为“是您想要的正则表达式 System.out.println("string".replaceAll("", "*")); 这将打印要匹配空字符串的*s*t*r*i*n*g*,并替换为“*”。所以,像这样的工作: System.out.println("string".replaceAll("", "*")); // "*s*t*r*i*n*g*" 或者更好的是,由于空字符串可以在没有正则表达式的情

我需要像这样转换字符串

"string"

正则表达式的模式是什么?语言是Java。

我认为
是您想要的正则表达式

System.out.println("string".replaceAll("", "*"));

这将打印要匹配空字符串的
*s*t*r*i*n*g*
,并替换为
“*”
。所以,像这样的工作:

System.out.println("string".replaceAll("", "*"));
// "*s*t*r*i*n*g*"
或者更好的是,由于空字符串可以在没有正则表达式的情况下进行字面匹配,因此您只需执行以下操作:

System.out.println("string".replace("", "*"));
// "*s*t*r*i*n*g*"

为什么会这样 这是因为字符串的任何实例
都以(“”)开头,而
以(“”)结尾,并且
包含(“”)。
在任何字符串的任意两个字符之间,都有一个空字符串。事实上,在这些位置有无限多的空字符串

(是的,空字符串本身也是如此。这是一个“空”字符串
包含
本身!)

在这种情况下,当查找下一个匹配项时,正则表达式引擎和
String.replace
会自动推进索引,以防止无限循环


“真正的”正则表达式解决方案 没有必要这样做,但此处显示的是出于教育目的:类似的内容也适用:

System.out.println("string".replaceAll(".?", "*$0"));
// "*s*t*r*i*n*g*"
通过将“任意”字符与
匹配,并将其替换为
*
和该字符,方法是通过反向引用组0

要为最后一个字符添加星号,我们允许有选择地将
匹配。这是因为
是贪婪的,如果可能的话,它将始终使用一个字符,即除了最后一个字符以外的任何地方

如果字符串可能包含换行符,则使用
Pattern.DOTALL/(?s)
模式

工具书类

    • 如果这就是你所做的,我不会使用正则表达式:

      public static String glitzItUp(String text) {
          return insertPeriodically(text, "*", 1);
      }
      

      定期插入公共静态字符串(
      字符串文本、字符串插入、整型句点)
      {
      StringBuilder=新的StringBuilder(
      text.length()+insert.length()*(text.length()/句点)+1);
      int指数=0;
      
      虽然(index只是一个混蛋,我要说使用J:

      我花了一学年的时间学习Java,在这个夏天自学了一点J,如果你打算自己做这件事,使用J可能是最有效的,因为整个插入星号的过程很容易通过一个简单的动词定义和一个循环来完成

      asterisked =: 3 : 0 
       i =. 0
       running_String =. '*'
       while. i < #y do. 
          NB. #y returns tally, or number of items in y: right operand to the verb
          running_String =. running_String, (i{y) , '*'
          i =. >: i
       end.
       ]running_String
      )
      
      asterisked=:3:0
      i=.0
      正在运行的字符串=。*'
      当然,我喜欢。
      注意#y返回Tall或y中的项数:动词的右操作数
      running_String=。running_String,(i{y),'*'
      i=.>:i
      结束。
      ]跑线
      )
      

      这就是为什么我会使用J:我知道怎么做,而且只松散地学习了几个月的语言。这并不像整体上那么简洁。replaceAll()方法,但您可以自己做,稍后根据您的规范进行编辑。请随意删除此/troll this/get-Flamed in我的建议J,我真的不在乎:我不是在宣传它。

      那不是regex;)
      replace()
      方法会逐字符替换。这里您要替换的是“nothing”通过
      *
      。真正的正则表达式替换是通过
      replaceAll()
      方法完成的。@BalusC:我想这是一个微妙的暗示,正则表达式是不必要的:PNo,这是我的错,但空字符串也可以作为正则表达式使用。编辑我的答案以使用replaceAll。实际上,
      string.replace(CharSequence,CharSequence)使用
      Pattern`进行替换。因此,实际上,它是正则表达式:p@TheEliteGentleman:已确认。哦,我的天啊。我一点也没想到。我想我过去一直在告诉人们谎言,当我说
      替换
      更快时。那是一些非常难看的代码。对不起,但是好的旧Java代码在我看来好多了。这就是我所说的Java style J。一个真正了解J的人可以用一行J来编写整个程序。比较Java和J就像比较秘书。Java是一个漂亮的人,可以把事情完成,但是冗长而循序渐进。J是一个很难看的人,也很难看,但是非常高效和勤奋。我很感谢你去我的办公室nto这是为什么。你赢得了35k的声誉!DDoS不是每个字符串
      都包含
      本身吗?小字符串的速度差异显著吗?
      
      public static String insertPeriodically(
          String text, String insert, int period) 
      {
          StringBuilder builder = new StringBuilder(
              text.length() + insert.length() * (text.length()/period)+1);
      
          int index = 0;
          while (index <= text.length())
          {
              builder.append(insert);
              builder.append(text.substring(index,
                  Math.min(index + period, text.length())));
              index += period;
          }
          return builder.toString();
      }
      
      asterisked =: 3 : 0 
       i =. 0
       running_String =. '*'
       while. i < #y do. 
          NB. #y returns tally, or number of items in y: right operand to the verb
          running_String =. running_String, (i{y) , '*'
          i =. >: i
       end.
       ]running_String
      )