2

我想通过的例子是:

  1. “..”
  2. “废话”
  3. “废话*”
  4. “废话。废话”
  5. “废话。废话*”
  6. 2-5(非 1)中的任何一个,末尾附加 [@attrib="value"][@attrib="value" and @attrib2="value2" and ...]

我不想通过的例子是:

  1. “”
  2. “。”
  3. " "
  4. “……”
  5. “.blah”
  6. “-废话”

基本上想要“..”

或者

可以包含但不以点或破折号开头的 az 字符串(可选地后跟 *)(可选地后跟属性/值列表)

组是:

  1. ".." 或字符串 az 包括但不以点/破折号开头
  2. "*" 或 StringUtils.EMPTY 如果不匹配
  3. 属性组或 StringUtils.EMPTY 如果不匹配

我目前拥有的正则表达式是:

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

...如果只有“..”或者第一组以字母开头但以点或破折号结尾,则不起作用。我为使其适用于这两种情况所做的一切努力都把整个事情搞砸了。

感谢所有帮助。

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

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

...但这会导致后一组出现问题

4

1 回答 1

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)
    }
} 

希望这可以帮助。

于 2012-08-20T00:23:22.233 回答