我想传递的示例是:
- ".."
- “废话”
- “废话*”
- “废话.废话”
- “blah.blah*”
- 任何 2-5(不是 1)与 [@attrib="value"] 或 [@attrib="value"and @attrib2="value2"and ...] 附加到结束
我不想通过的例子是:
- ""
- “。”
- ""
- “……”
- .blah"
- “-废话”
基本上想要“..”
或
可以包含但不以点或破折号开头的 a-z 字符串 (可选地后跟 *)(可选地后跟属性/值列表)
组是:
- ".."或字符串 a-z,包括但不以点/破折号开头
- “*”或 StringUtils.EMPTY 如果不匹配
- 属性组或 StringUtils.EMPTY(如果不匹配)
我目前的正则表达式是:
"^([a-z]+[a-z.\\-]*)([\\*]*)[\\[]*([^\\]]*)[\\]]*"
...如果只有“..”或者第一组以字母开头但以点或破折号结尾,则不起作用。我为使它适用于这两个案例而尝试做的一切都把整个事情搞砸了。
感谢所有帮助。
通过我下面评论中的正则表达式并稍微更改与此正则表达式一起使用的代码,我让它为“..”工作,但是,我还没有让它与以字母结尾的第一组一起工作仅有的。我尝试将 [a-z]+$ 添加到该组的末尾:
"^(\\.\\.|^([a-z]+[a-z.\\-]*[a-z]+$)([\\*]*)[\\[]*([^\\]]*)[\\]]*)$"
...但这会导致后一组出现问题
最佳答案
此正则表达式似乎符合您问题中指定的要求:
^(?:(\.{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)
}
}
希望这对您有所帮助。
关于Java 正则表达式可变分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11941308/