Java 多个字符的正则表达式优先级

Java 多个字符的正则表达式优先级,java,regex,operator-precedence,Java,Regex,Operator Precedence,基于这个问题,我在扩展我的正则表达式时遇到了一个问题,现在看起来是这样的: String pattern= "(?:I[XV]|X[LC]|C[DM]|[XVLCDM])+"; String test="XM"; System.out.println(test.matches(pattern)); 我的字符串中允许的字符是IVXLCDMAQT XM当前返回true。但这不应该,因为X只能在L或C之前。我如何修改当前的正则表达式以防止XM返回true,并在字符串中

基于这个问题,我在扩展我的正则表达式时遇到了一个问题,现在看起来是这样的:

String pattern= "(?:I[XV]|X[LC]|C[DM]|[XVLCDM])+";
        String test="XM";
        System.out.println(test.matches(pattern));
我的字符串中允许的字符是IVXLCDMAQT

XM当前返回true。但这不应该,因为X只能在L或C之前。我如何修改当前的正则表达式以防止XM返回true,并在字符串中包含允许的字符

根据请求更新: 优先顺序:

I后面只能跟X或V,X后面只能跟L或C,C后面只能跟D或M。其余的字母无关紧要


因此XM应该返回false。但是,目前还没有

如果我了解您的要求,我们需要从最终备选方案中删除
X
C
,并添加一些外观标题:

^(?:I(?=[XV])|X(?=[LC])|C(?=[DM])|[VLDM])+$
选项:允许I、X和Cat作为字符串的结尾

如果希望允许在字符串末尾使用I、X或C,请添加以下内容:|[IXC]$(多种方法之一)

正则表达式变为:

(?:I(?=[XV])|X(?=[LC])|C(?=[DM])|[VLDM]|[IXC]$)+

如果您的目标是只匹配有效的罗马数字,那么您的方法是有缺陷的。您需要从高数字开始,然后逐步向下,而不是相反:为什么要在模式中添加
[XVLCDM]
?因为这些是我的字符串中允许的字符,所以我实际上应该再添加一个。但更一般地说,我能设计正则表达式来包含所有其他字符吗?我一分钟前的第一次尝试有一个bug。修好了,请看一下:)是的,它在工作。你能解释一下为什么我需要删除X和C吗?同时,我正在测试它,所以当你把I(?=[XV])与你早期版本的I[XV]相比有什么区别?
(?=[XV])
是一个前瞻。这意味着匹配一个I,只要后面跟着一个X或V。我们必须删除X和C,因为字符类
[XVLCDM]
匹配它们,而不对它们施加任何条件<代码>[XVLCDM]表示匹配该类中的一个字符。很晚了,但希望能有所帮助,如果您有问题,请告诉我。:)计数器案例:XLIXI这会导致返回false。与XLIXX相同。但是[IXC]应该允许字符串以I,X,C结尾,对吗?