gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:51:54 26 4
gpt4 key购买 nike

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

使用

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com