Java Regex Varied Groupings

时间:2012-08-13 19:52:44

标签: java regex

我想要传递的例子是:

  1. “..”
  2. “嗒嗒”
  3. “嗒嗒*”
  4. “blah.blah”
  5. “blah.blah *”
  6. 2-5(不是1)中的任何一个,[@ attrib =“value”] [@ attrib =“value”和@ attrib2 =“value2”和...]附加到结束
  7. 我不想传递的例子是:

    1. “”
    2. “”
    3. “”
    4. “...”
    5. “嗒嗒”
    6. “ - 嗒嗒”
    7. 基本上想要“......”

      一串a-z,可以包括但不以点或短划线开头 (可选地后跟*)(可选地后跟属性/值列表)

      群组:

      1. “..”或包含但不以点/短划线开头的字符串a-z
      2. “*”或StringUtils.EMPTY(如果不匹配)
      3. 属性组或StringUtils.EMPTY(如果不匹配)
      4. 我目前的正则表达式是:

        "^([a-z]+[a-z.\\-]*)([\\*]*)[\\[]*([^\\]]*)[\\]]*"
        

        ...如果只有“..”,或者如果第一组以字母开头但以点或短划线结束,则不起作用。我试图让它适用于这两种情况的所有事情都搞砸了整个事情。

        感谢所有帮助。

        通过下面我的评论中的正则表达式并更改了与此正则表达式一起使用的代码,我让它为“..”工作,但是,我还没有让它与第一个以字母结尾的组一起工作只要。我尝试将[a-z] + $添加到该组的末尾:

        "^(\\.\\.|^([a-z]+[a-z.\\-]*[a-z]+$)([\\*]*)[\\[]*([^\\]]*)[\\]]*)$"
        

        ......但这会导致后者的问题

1 个答案:

答案 0 :(得分:0)

此正则表达式似乎符合您的问题中指定的要求:

^(?:(\.{2})|([a-z]+\.?[a-z]*\*?)\s?\[?(?:(@\w+="\w+")(?:\sand\s)?)*\]?)$

我假设您能够进行开始/结束行断言,因为您正在尝试制作它们。如果没有,请分别从开头和结尾删除'^'和'$'。

在java中,使用此代码运行:

Pattern regex = Pattern.compile("^(?:(\\.{2})|([a-z]+\\.?[a-z]*\\*?)\\s?\\[?(?:(@\\w+=\"\\w+\")(?:\\sand\\s)?)*\\]?)$", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
Matcher matcher = regex.matcher("target string");
if (matcher.matches()) {
    for (int i = 1; i <= matcher.groupCount(); i++) {
        String targetGroup = matcher.group(i)
    }
} 

希望这有帮助。