带正则表达式的String.replaceAll()搞砸了

时间:2016-03-16 20:16:39

标签: java regex replaceall

我正在尝试在Java中实现Swedish "Robbers language"。它基本上只是用自己替换每个辅音,然后是“o”,然后是自己。我以为我使用了这段代码

str.replaceAll("[bcdfghjklmnpqrstvwxz]+", "$0o$0");

但是当有两个或更多后续辅音时失败,例如

String str = "horse";

它应该生成hohororsose,但我得到hohorsorse。我猜测替换会以某种方式混淆原始字符串中的匹配索引。我怎样才能使它发挥作用?

2 个答案:

答案 0 :(得分:2)

str.replaceAll("[bcdfghjklmnpqrstvwxz]", "$0o$0");

删除+量词,因为它会对辅音进行分组。

// when using a greedy quantifier
horse
h   | o | rs    | e
hoh | o | rsors | e
  

加号与前面的一个或多个字符,类或子模式匹配。例如,a +匹配ab和aaab。但不像*和   a?,模式a +在字符串的开头不匹配   缺乏" a"字符。
  https://autohotkey.com/docs/misc/RegEx-QuickRef.htm

答案 1 :(得分:1)

+表示:在一次和无限次之间,尽可能多次,根据需要回馈(贪婪)

+?表示:在一次和无限次之间,尽可能少的时间,根据需要进行扩展(懒惰)

{1}表示:恰好一次(无意义的量词)

在您的情况下,您不需要量词。

您可以在https://regex101.com/

在线体验正则表达式