如何使用可选组作为以下首选 java 语法使用 Regex 解析文本
How parse text with Regex using optional groups as the following preferred java syntax
我想将正则表达式设为可选组
使用
正文如下:
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
我所做更改的关键包括使捕获组变得惰性 (.*?)
。此外,我将源和子源的整个模式设为可选,例如
(?:\s+Source\s*=\s*(.*?))?
注意周围的组以 ?:
开头,它告诉正则表达式引擎 not 捕获它。因此只有您原来的 (.*?)
组可能会被捕获,假设文本有它。
为了让模式起作用,我需要在某些地方假设 \s+
而不是 \s*
。
我想将正则表达式设为可选组
使用
正文如下:
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
我所做更改的关键包括使捕获组变得惰性 (.*?)
。此外,我将源和子源的整个模式设为可选,例如
(?:\s+Source\s*=\s*(.*?))?
注意周围的组以 ?:
开头,它告诉正则表达式引擎 not 捕获它。因此只有您原来的 (.*?)
组可能会被捕获,假设文本有它。
为了让模式起作用,我需要在某些地方假设 \s+
而不是 \s*
。