正则表达式从字母表中排除数字

时间:2015-08-12 20:39:53

标签: java regex

我正在尝试匹配文档中的所有字母表列表。这就是它们出现的方式(在新行上):

(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)匹配,因为我这里不是数字。

1 个答案:

答案 0 :(得分:1)

修改

正则表达式不匹配括号中的罗马数字,在新行中,它们在字母表列表中按顺序出现。它应该达到罗马50(L)。

\((?![ivxl]+)[a-z]+\)|(?<!xlix\)\n)\(l\)|(?<![ivxl]\)\n)\((?=[ivxl]+).+\)(?!\n\([ivxl]+\))

DEMO

以前的答案

如果您不想只匹配完整的罗马数字,请尝试使用:

\((?!\b([mdclx]+)?(i((ii?)|v|X)?|x|v(ii?i?)?)\b|[mdclx]+\b)[a-z]+\)

DEMO

是:

  • \( - 左括号,
  • (?!\b([mdclx]+)?(i((ii?)|v|X)?|x|v(ii?i?)?)\b|[mdclx]+\b) - 负向前看以排除罗马数字的varius版本,但是 用单词boudaries \b括起来,所以整个单词需要匹配罗马数字,
  • [a-z]+\) - 一个或多个字母后跟右括号,
似乎我的正则表达式有时可能会匹配错误,正确的正则表达式似乎是(修改版本来自 Steven Levithan和Jan Goyvaerts的正则表达手册:

\((?!\b([MDCLXVI])M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})\b)[a-z]+\)

DEMO

这些输入的结果相同,但细节不同