Java 正则表达式可变分组

标签 java regex

我想传递的示例是:

  1. ".."
  2. “废话”
  3. “废话*”
  4. “废话.废话”
  5. “blah.blah*”
  6. 任何 2-5(不是 1)与 [@attrib="value"] [@attrib="value"and @attrib2="value2"and ...] 附加到结束

我不想通过的例子是:

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

基本上想要“..”

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

组是:

  1. ".."或字符串 a-z,包括但不以点/破折号开头
  2. “*”或 StringUtils.EMPTY 如果不匹配
  3. 属性组或 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/

相关文章:

正则表达式:匹配除特定模式之外的所有内容

java - Android - 无法从 ListView 调用 setOnItemClickListener

java - 按顺序运行 Hadoop Mapper

php - 匹配以以下开头的内容的正则表达式

正则表达式 - 查找 2000 到 3000 之间的数字

C# ReadLine 转义回车/换行符?

python - 正则表达式中多个字符的重复累积和恒定(python)

java - 何时使用请求作用域的 bean 与在堆栈中传递参数?

c# - 检测两张图片是否相似

java - 将日期字符串转换为 GMT 日期,但显示的是 EST