正则表达式,捕获组中的特定最后一个字符类型

时间:2012-08-15 14:05:53

标签: java regex

我目前的正则表达式是:

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

它捕获“..”(组1),组2-4为空
  - 一组小写,点,破折号。从小写字母开始(第2组)
  - 后跟可选的星号(第3组)
  - 后面是方括号内的可选内容(第4组)

我遇到了一些问题,首先是制作它,所以group2必须以字母结尾,我尝试了很多东西,包括:

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

杀死3-4组中的任何东西

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

似乎没有做任何不同的事情


我遇到的另一个问题是第4组,它不依赖于方括号(这是有意义的,因为我有*的字符)...但如果我删除该字符它不会给我任何小组的任何结果。

非常需要和赞赏任何帮助。


在回复以下评论时,以下内容应符合:“"string" - (group1)(group2)(group3)(group4)

".." - (..)()()()
"blah" - ()(blah)()()
"blah.blah" - ()(blah.blah)()()
"blah.blah*" - ()(blah.blah)(*)()
"blah*" - ()(blah)(*)()
"blah.blah*[foobar] - ()(blah.blah)(*)(foobar)
"blah[foobar] - ()(blah)()(foobar)

以下内容不匹配:

 "."
 "..."
 ".blah"
 "blah."
 ".blah*"
 "blah.*[foobar]

2 个答案:

答案 0 :(得分:2)

                   ┌ one or more lowercase letters followed by
                   │ 
                   │   ┌ none or several occurrences of ───────────────────────┐
                   │   │     ┌ dot or dash                                     │
                   │   │     │     ┌ followed by one or more lowercase letters │
                   │   │     │     │     ┌─────────────────────────────────────┘
                   │   │     │     │     │ 
                   │   │     │     │     │  ┌ followed by optional asterisk
                   │   │     │     │     │  │
                   │   │     │     │     │  │   ┌ followed by optional square brackets
            ┌ or   │   │     │     │     │  │   │         ┌ with some content inside │
            │      │   │     │     │     │  │   │         │        ┌─────────────────┘
            │      │   │     │     │     │  │   │         │        │
^(?:(\\.\\.)|(?:([a-z]+(?:[.\\-]*[a-z]+)*)(\\*?)(?:\\[([^\\]]*)\\])?))$
│   │      │                                                          │
│   └ two  │                                                          │
│     dots ┘                                                          │
│                                                                     │
└ start of string                                       end of string ┘

答案 1 :(得分:0)

这是我能想到的:

^(\.{2})?([a-z](?:\.*-*[a-z])*)?(\*)?(\[[^]]*\])?$

我不确定括号中允许的是什么,所以它匹配那里的任何非括号字母。

(正确转义:^(\\.{2})?([a-z](?:\\.*-*[a-z])*)?(\\*)?(\\[[^]]*\\])?$

此正则表达式:[a-z](?:\.*-*[a-z])*将始终匹配以小写字母开头和结尾的字符串。