我正在尝试匹配文档中的所有字母表列表。这就是它们出现的方式(在新行上):
(a)
(b)
(c)
(d)
..
..
(z)
(aa)
(bb)
..
(zz)
这是我用于此^ ?[\(]?([a-z])[\)]
然而,挑战是罗马数字。我想单独识别罗马数字,如果它们是这个字母表列表的一部分,我不想匹配它们。因此,例如,字母和数字将在(i), (v), (x) and (c)
上发生冲突(低于50)。
如何编写正则表达式来解决这个问题?
修改
让我简化一下这个问题。这是顺序 -
(a)
(b)
(c)
(d)
(i)
(ii)
(iii)
(iv)
(v)
(e)
从上面,我想匹配(a) (b) (c) (d) (e)
而不是数字。
数字总是从i开始。它们最多可以达到50个数字。正则表达式还必须处理(a) (b) (c) (d) (e) (f) (g) (h) (i) (j)
匹配,因为我这里不是数字。
答案 0 :(得分:1)
修改强>
正则表达式不匹配括号中的罗马数字,在新行中,它们在字母表列表中按顺序出现。它应该达到罗马50(L)。
\((?![ivxl]+)[a-z]+\)|(?<!xlix\)\n)\(l\)|(?<![ivxl]\)\n)\((?=[ivxl]+).+\)(?!\n\([ivxl]+\))
以前的答案
如果您不想只匹配完整的罗马数字,请尝试使用:
\((?!\b([mdclx]+)?(i((ii?)|v|X)?|x|v(ii?i?)?)\b|[mdclx]+\b)[a-z]+\)
是:
\(
- 左括号,(?!\b([mdclx]+)?(i((ii?)|v|X)?|x|v(ii?i?)?)\b|[mdclx]+\b)
-
负向前看以排除罗马数字的varius版本,但是
用单词boudaries \b
括起来,所以整个单词需要匹配罗马数字,[a-z]+\)
- 一个或多个字母后跟右括号,\((?!\b([MDCLXVI])M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})\b)[a-z]+\)
这些输入的结果相同,但细节不同