【问题标题】:String replace for Roman numerals罗马数字的字符串替换
【发布时间】:2016-11-15 14:44:32
【问题描述】:

我收到如下用户输入。

“ix 和 viii 都是罗马数字。 mcmlxxxvii 是哇的一年。 年份是 mmxvi。”

我必须搜索 i/p 中存在的所有罗马数字并将其转换为大写。所以我想使用字符串替换,如下所示,其中 xxx 是罗马数字。

input.replaceAll("(?i)xxx","XXX");

目前,我可以检查输入是否有。

System.out.println(input.matches("^.*M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}).*$"));

帮帮我。

【问题讨论】:

  • 如果你想匹配部分文本,不要使用锚点(^$
  • replaceAll 没用,搜索appendReplacement
  • @WiktorStribiżew 谢谢,但这需要适当的正则表达式。
  • 不可能使用 1 个正则表达式,您需要尽可能多地使用它们。这不是继续的方法,祝你好运。

标签: java regex roman-numerals mvel


【解决方案1】:

试试这个:

(?!\bi+\b)\b[dcmlxvi]+\b|(\bi+\.)

并替换为:

\U\1 will not work in java though,but the following code will

Explanation

java代码示例:

final String regex = "(?!\\bi+\\b)\\b[dcmlxvi]+\\b|(\\bi+\\.)";
String string = "i i Both ix is viii are roman numeral. mcmlxxxvii is wow year. Year is mmxvi. i i I i i i i am good";
String tmp;
final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    tmp=matcher.group(0).toUpperCase();
    string=string.replace(matcher.group(0),tmp);
}

System.out.println(string);

【讨论】:

  • 如果输入以罗马数字开头,例如“i。两个 ix 是 viii 都是罗马数字。mcmlxxxvii 是哇年份。年份是 mmxvi。”,这将失败。我也得到相同的结果 "\\b(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV |V?I{0,3}))\\b"。
  • 所以单独的'i'是你的问题吗?因为它可以是一个单词,也可以是一个罗马数字......所以你不想让单个单词 i 大写?
  • 观看我更新的答案,它不会大写单词 i
  • 对不起,如果它以“ii”开头,这将不起作用。
  • 我不是很清楚,你想把 ii 大写成 II 吗?如果您不想大写 i 或 ii 或 iii 或仅由 i 组成的单词,那么我已经更新了我的答案,现在试试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 2016-07-04
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
相关资源
最近更新 更多