正则表达式 - 忽略字符串的一部分

Regex - Ignore part of the string

我正在开发使用 Java 正则表达式包的 Pentaho:java.util.regex.

我想从字符串开头和结尾的文本文件行中提取大量信息:

^StartofString Controls\(param1="(D[0-9]{0,})",param2="(G[0-9]{0,})",param3="([^"]{0,})",param4="([^"]{0,})"\):(?:.*)param5="([^"]{0,})",.*

我想忽略字符串的很长部分并尝试使用 (?:.*)

当我在步骤中测试 Regex 时,正面前瞻似乎有效,但在我执行转换时无效。 我在 'Regex Evaluation' 步骤测试字符串,检查 'Filter rows' 上一步的布尔值并在 Java 脚本步骤中提取组:

var pattern = Packages.java.util.regex.Pattern.compile(patternStr);
var matcher = pattern.matcher(content.toString());
var matchFound = matcher.find();

patterStr 与 'Regex Evaluation' 步骤中的正则表达式相同,但带有转义字符:\

我已经阅读了很多关于在正则表达式中忽略部分字符串的问题,但仍然找不到答案。 欢迎任何帮助。 如果需要,我可以提供更多信息。

非捕获组并不意味着它的内容不会被捕获,这意味着它不会被捕获到一个组中(尽管您仍在正则表达式中对标记进行分组,这可能很有用立即对它们应用修饰符)。

例如,这些正则表达式将全部匹配完全相同的 abc 字符串:

abc
a(?:b)c
a(b)c

但是在第三种情况下,您已经定义了一个捕获组,这将使您能够独立访问 b。前两种情况在各方面都是平等的。

当您想将修饰符应用于一组标记而不需要稍后可以引用的额外组时,非捕获组就很有用了。以下正则表达式将全部匹配相同的字符串:

(ab)*(c)
(?:ab)*(c)

我们想将 * 应用到 ab 令牌。我们要么使用捕获组(第一个示例)并创建一个我们可以引用的组,要么使用非捕获组。正则表达式末尾的反向引用应该匹配 c ;在第一个示例中,它是第二组,因为 ab 是第一组,而在第二个示例中,c 是可以引用的第一组。

现在我已经解释了非捕获组的作用,让我们来解决您的问题:您想从字符串的中间删除一些东西,您知道什么是开头和结尾。

假设您要匹配的字符串如下:

Aremove-thisB

并且您想要结果 AB

有多种策略可以做到这一点,最简单的方法可能是在它们自己的捕获组中匹配字符串的开头和结尾,然后从那里创建输出:

var pattern = Packages.java.util.regex.Pattern.compile("(A).*(B)");
var matcher = pattern.matcher(content.toString());
var matchFound = matcher.find();
if (matchFound) { return matcher.group(1) + matcher.group(2); }