包含单词,数字和罗马数字的特定要求的正则表达式

时间:2018-03-31 07:24:55

标签: java regex

我是使用正则表达式的新手。我正在尝试编写一个RegEx来匹配,如:`

  

(任何单词+任何单词   从(类,标准,标准,等级,级别,学期,SEM)+空间(可选)+任何   1到12之间的数字或I到之间的任何罗马数字   XII +空格+任何单词(可选)

RegEx应该不区分大小写。 例如:'类xi ncert的数学教科书'。 RegEx将匹配短语“ class xi ”。 如果字符串如下:' viii standard ncert '的数学教科书。 RegEx不应该返回任何匹配。

我写过RegEx:

  

((类(Ⅰ')|标准| STD |等级|水平| SEM)(   )(1 [0-2] | [1-9] | IX | IV | V I {0,3} |?XI {0,2})(* |。?$))

以下是java代码:

    String pattern9 = "(?i)((class|standard|std|grade|level|sem)( )?(1[0-2]|[1-9]|IX|IV|V?I{0,3}|XI{0,2})(.*?|$))";

    Pattern pattern = Pattern.compile(pattern9);
    Matcher m = pattern.matcher("mathematics text book of viii standard ncert");

    if (m.find( )) {
        System.out.println(m.group());
    }else{
        System.out.println("No match");
    }

这个正则表达式的作用如下:

Input : 'mathematics text book of class xi ncert'
Output : 'class'   (Expected o/p : 'class xi')


Input : 'mathematics text book of viii standard ncert'
Output : 'standard'    (Expected o/p : No match)

根据我的要求,有人可以帮我写一个正确的正则表达式吗?

1 个答案:

答案 0 :(得分:3)

你的错误在V?I{0,3}允许空匹配,并在你的两种情况下都这样做。您应该使用VI{0,3}|I{1,3}代替正确覆盖它。

此外(.*?|$)相当无意义,因为它总是匹配一个空字符串。