如何使用可选组作为以下首选 java 语法使用 Regex 解析文本

How parse text with Regex using optional groups as the following preferred java syntax

我想将正则表达式设为可选组

使用

https://regex101.com/

正文如下:

start to proceed task TaskId = id Account = xx@ttt.com Type = value1 Source = source_value SubSource = subSource_value

可选的组是Source,SubSource 其余都是必填的

我试过如下使用,但没有成功使用可选

正则表达式:

 start to proceed task\s*TaskId\s*=\s*(.*)\s*Account\s*=\s*(.*)\s*Type\s*=\s*(.*)\s*Source\s*=\s*(.*)\s*SubSource\s*=\s*(.*) 

输出:

Group 1.    31-36   `id `
Group 2.    46-57   `xx@ttt.com `
Group 3.    64-71   `value1 `
Group 4.    80-93   `source_value `
Group 5.    105-120 `subSource_value`

但是当我从文本中删除 Source 或 SubSource 或两者 Source = source_value SubSource = subSource_value 时,没有显示输出,我的目的是:(取决于删除的内容)

Group 1.    31-36   `id `
Group 2.    46-57   `xx@ttt.com `
Group 3.    64-71   `value1 ` 

这是一个有效的脚本和模式:

String line = "start to proceed task TaskId = id Account = xx@ttt.com Type = value1 Source = source_value SubSource = subSource_value";
String pattern = "start to proceed task\s+TaskId\s*=\s*(.*?)\s+Account\s*=\s*(.*?)\s+Type\s*=\s*(.*?)(?:\s+Source\s*=\s*(.*?))?\s+(?:SubSource\s*=\s*(.*))?";

Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(line);
if (m.find()) {
    System.out.println("Group 1: " + m.group(1) );
    System.out.println("Group 2: " + m.group(2) );
    System.out.println("Group 3: " + m.group(3) );
    System.out.println("Group 4: " + m.group(4) );
    System.out.println("Group 5: " + m.group(5) );
}

Group 1: id
Group 2: xx@ttt.com
Group 3: value1
Group 4: source_value
Group 5: subSource_value

Demo

我所做更改的关键包括使捕获组变得惰性 (.*?)。此外,我将源和子源的整个模式设为可选,例如

(?:\s+Source\s*=\s*(.*?))?

注意周围的组以 ?: 开头,它告诉正则表达式引擎 not 捕获它。因此只有您原来的 (.*?) 组可能会被捕获,假设文本有它。

为了让模式起作用,我需要在某些地方假设 \s+ 而不是 \s*