首页 > 解决方案 > 使用罗马数字删除编号

问题描述

我正在尝试从包含标题、段落等的文本中删除有效的罗马数字(编号)...

我正在使用这个正则表达式

Pattern ROMAN = Pattern.compile("^[([]‌?x{0,3}(i[xv]‌|v?i{0,3})[)\.]/]{1,2}", Pattern.CASE_INSENSITIVE);

虽然它也匹配空括号。

我想要做的是删除以下内容:

Input :
iv. foo foo foo.
Output:
foo foo foo.
Input :
v) foo foo foo.
Output:
foo foo foo.

但在不使用它们进行编号时也不做任何事情:

Input :
foo foo foo i) foo v) .
Output:
foo foo foo i) foo v) .

正则表达式应匹配的另一个示例: iv) X) ix/ V/ x. IV.

标签: javaregex

解决方案


像下面的Regex怎么样:

^((?=[mdclxvi])m*(c[md]|d?c{0,3})(x[cl]|l?x{0,3})(i[xv]|v?i{0,3})(?:\)|\.))

这匹配一个罗马数字,后跟一个).字符。Steven Levithan 和来自 O'Reilly 的 Jan Goyvaerts有一篇关于匹配罗马数字正则表达式食谱的好文章。


推荐阅读