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

标签 regex regex-group

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

使用

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*(.*?))?

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

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

关于regex - 如何使用可选组作为以下首选 java 语法使用 Regex 解析文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50502942/

相关文章:

html - 如何在输入元素的 HTML 模式属性中设置 RegEx 全局标志?

java - 任何带有回车符的字符

java - 无法追踪为什么这个正则表达式代码无限运行

javascript - 如何匹配字符,但如果它们严格用引号引起来则不匹配

javascript - REGEX 丢弃 float 和前导零

regex - Apache Rewrite 子域上的图像

此正则表达式模式的 C# 等效项

c++ - 为什么我的代码与这些s表达式不匹配正则表达式?

正则表达式 : If-Clause for capturing group possible?

java - 查找恰好(或至少)有一个换行符的 n 个字符