我想将正则表达式设为组可选
使用
正文如下:
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*(.*?))?
请注意,周围的组以 ?:
开头,它告诉正则表达式引擎不 捕获它。所以只有你原来的 (.*?)
组可能会被捕获,假设文本有它。
为了让模式起作用,我需要在某些地方假设 \s+
而不是 \s*
。
关于regex - 如何使用可选组作为以下首选 java 语法使用 Regex 解析文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50502942/